/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tramite.beans;

import java.io.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.persistence.NoResultException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.colegiatura.be.ColegiadoImagen;
import org.cip.esymons.general.bc.IgvFacadeLocal;
import org.cip.esymons.general.be.Area;
import org.cip.esymons.general.be.Departamento;
import org.cip.esymons.general.be.DireccionPersona;
import org.cip.esymons.general.be.Distrito;
import org.cip.esymons.general.be.Empleado;
import org.cip.esymons.general.be.Igv;
import org.cip.esymons.general.be.PersonaJuridica;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.be.Provincia;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.general.util.Utiles;
import org.cip.esymons.tesoreria.be.CuentaIngreso;
import org.cip.esymons.tesoreria.be.DocumentoPago;
import org.cip.esymons.tesoreria.be.EnumEstadoMovimiento;
import org.cip.esymons.tesoreria.be.EnumEstadoSolicitante;
import org.cip.esymons.tesoreria.be.MovimientoCuenta;
import org.cip.esymons.tesoreria.be.TipoMoneda;
import org.cip.esymons.tesoreria.be.ValorCuenta;
import org.cip.esymons.tramite.adapters.RutaCarpetaReporte;
import org.cip.esymons.tramite.bc.AreaDelegate;
import org.cip.esymons.tramite.bc.CertificadoDelegate;
import org.cip.esymons.tramite.bc.ColegiadoDelegate;
import org.cip.esymons.tramite.bc.ColegiadoImagenDelegate;
import org.cip.esymons.tramite.bc.CuentIngresoTraDelegate;
import org.cip.esymons.tramite.bc.DirRecepDelegate;
import org.cip.esymons.tramite.bc.DireccionDelegate;
import org.cip.esymons.tramite.bc.DirectivosDelegate;
import org.cip.esymons.tramite.bc.DistritoDelegate;
import org.cip.esymons.tramite.bc.DocRequeridoDelegate;
import org.cip.esymons.tramite.bc.DocumentoExternoDelegate;
import org.cip.esymons.tramite.bc.DocumentoGeneradoDelegate;
import org.cip.esymons.tramite.bc.DocumentoImagenDelegate;
import org.cip.esymons.tramite.bc.DocumentoIncluidoDelegate;
import org.cip.esymons.tramite.bc.EmpleadoDelegate;
import org.cip.esymons.tramite.bc.ExpedienteDelegate;
import org.cip.esymons.tramite.bc.MovimientoCuentaDelegate;
import org.cip.esymons.tramite.bc.OperacionDelegate;
import org.cip.esymons.tramite.bc.PersonaJuridicaDelegate;
import org.cip.esymons.tramite.bc.PersonaNaturalDelegate;
import org.cip.esymons.tramite.bc.ProvinciaDelegate;
import org.cip.esymons.tramite.bc.RealizarPagoDelegate;
import org.cip.esymons.tramite.bc.SecuenciaDocumentoFacadeLocal;
import org.cip.esymons.tramite.bc.SolRecepDelegate;
import org.cip.esymons.tramite.bc.TipoCambioDelegate;
import org.cip.esymons.tramite.bc.TipoDocumentoDelegate;
import org.cip.esymons.tramite.bc.TramiteDelegate;
import org.cip.esymons.tramite.bc.TransaccionDelegate;
import org.cip.esymons.tramite.bc.ValorCuentaDelegate;
import org.cip.esymons.tramite.be.Certificado;
import org.cip.esymons.tramite.be.CuentaingresoTramite;
import org.cip.esymons.tramite.be.DirRecep;
import org.cip.esymons.tramite.be.DocRequerido;
import org.cip.esymons.tramite.be.DocumentoExterno;
import org.cip.esymons.tramite.be.DocumentoGenerado;
import org.cip.esymons.tramite.be.DocumentoImagen;
import org.cip.esymons.tramite.be.DocumentoIncluido;
import org.cip.esymons.tramite.be.EnumEstadoCert;
import org.cip.esymons.tramite.be.EnumEstadoOperacion;
import org.cip.esymons.tramite.be.EnumTipoTramite;
import org.cip.esymons.tramite.be.EnumVoucher;
import org.cip.esymons.tramite.be.Expediente;
import org.cip.esymons.tramite.be.Operacion;
import org.cip.esymons.tramite.be.SecuenciaDocumento;
import org.cip.esymons.tramite.be.SolRecep;
import org.cip.esymons.tramite.be.TipoDocumento;
import org.cip.esymons.tramite.be.Tramite;
import org.cip.esymons.tramite.be.Transaccion;
import org.richfaces.model.selection.SimpleSelection;

/**
 *
 * @author ChristianATE
 */
public class TramitesController {

    private ColegiadoImagenDelegate colImagenDelegado;
    private RealizarPagoDelegate realizarPagoFacade;
    private TipoCambioDelegate tipoCambioDelegado;
    private SimpleSelection docRequeridoSelecionadas;
    private DocRequerido docRequeridoSeleccionado;
    private DocRequerido docRequeridoCargado;
    private Short destino;
    private Short receptor;
    private String montoPagar;
    private int intSolicitado;
    private int intPagante;
    private int tipoDoc;
    private int tipoDocSol;
    private int tipoPersona;
    private int tipoPersonaSol;
    private int estadoCert;
    private String sexo;
    private String sexoSol;
    private JasperController jasper;
    private DocumentoGenerado docGenerado;
    private EmpleadoDelegate emplDelegado;
    private AreaDelegate areaDelegado;
    private CuentIngresoTraDelegate citDelegado;
    private CertificadoDelegate certDelegado;
    private PersonaJuridicaDelegate perJurDelegado;
    private DocumentoGeneradoDelegate docGenDelegado;
    private MovimientoCuentaDelegate movCuentaDelegado;
    private Certificado certificado;
    private ValorCuentaDelegate valorCuentaDelegado;
    private SolRecepDelegate solRecepDelegado;
    private PersonaNaturalDelegate personaDelegado;
    private ColegiadoDelegate colegiadoDelegado;
    private DireccionDelegate delegadoDireccion;
    private TransaccionDelegate transaccionDelegado;
    private ExpedienteDelegate expedienteDelegado;
    private DocumentoExternoDelegate documentoExtDelegado;
    private DocumentoImagenDelegate documentoImaDelegado;
    private OperacionDelegate operacionDelegado;
    private DocumentoIncluidoDelegate docIncDelegado;
    private DocRequeridoDelegate delegadoDocRequerido;
    private DirRecepDelegate dirRecepDelegado;
    private TramiteDelegate delegadoTramite;
    private TipoDocumentoDelegate tipoDocDelegado;
    private List<Tramite> tramites;
    private List<CuentaingresoTramite> cuentaIngresoTra;
    private List<MovimientoCuenta> movimientoCuentas;
    private List<CuentaingresoTramite> cuentasIngresoOp;
    private List<CuentaingresoTramite> cuentasIngresoGuard;
    private MovimientoCuenta movimientoCuenta;
    private CuentaingresoTramite cuentIngTram;
    private DireccionPersona direccionNueva;
    private DireccionPersona ubicacion;
    private DireccionPersona direccionSeleccionada;
    private Expediente expediente;
    private Empleado empleado;
    private Transaccion transaccion;
    private Tramite tramite;
    private TipoMoneda tipoMoneda;
    private Solicitante solicitante;
    private PersonaNatural solicitantePer;
    private PersonaJuridica solicitanteEmp;
    private PersonaNatural solicitado;
    private PersonaNatural propietario;
    private PersonaNatural receptorPer;
    private PersonaJuridica persJuridica;
    private Operacion operacion;
    private DocumentoExterno documentoExterno;
    private DocumentoImagen DocImagen;
    private DocumentoIncluido docIncluido;
    private List<DocumentoIncluido> documentosRecibidos;
    private List<DocumentoImagen> docImagenes;
    private List<DocRequerido> docRequeridos;
    private List<DocRequerido> docCargados;
    private TipoDocumento tipoDocumento;
    private Calendar fecha;
    private String cip;
    private String dni;
    private String dniSolicitante;
    private String dniProp;
    private String cipSolicitante;
    private String dniReceptor;
    private String voucher;
    private String voucher2;
    private String nomImagen1;
    private String nomImagen2;
    private String direccion;
    private String ruta;
    private String rutaImagen;
    private String errorSol;
    private List<Transaccion> listaTransacciones;
    private boolean modal;
    private boolean preformateado;
    private boolean modalU;
    private boolean errorSolicitante;
    private boolean modalObserv;
    private boolean modalPer;
    private boolean modalProp;
    private boolean modalRecp;
    private boolean modalCI;
    private boolean voucher1Activo;
    private boolean voucher2Activo;
    private boolean voucher2Visible;
    private boolean comboActivo;
    private boolean verNumVoucher1;
    private boolean tramiteCip;
    private boolean docRequ;
    private boolean cuentIng;
    private boolean operAprob;
    private Date fechIni;
    private Date fechFin;
    private EnumVoucher voucherSeleccionado;
    private EnumVoucher voucherCache;
    private static final String extImagen = "jpg,jpeg,gif,bmp,png,tif";
    private static final String extDoc = "doc,docx,txt,pdf,ppt,xls,xlsx";

    public TramitesController() {
        inicializar();
    }

    private void inicializar() {
        colImagenDelegado = new ColegiadoImagenDelegate();
        propietario = new PersonaNatural();
        persJuridica = new PersonaJuridica();
        tipoCambioDelegado = new TipoCambioDelegate();
        perJurDelegado = new PersonaJuridicaDelegate();
        ProvDelegado = new ProvinciaDelegate();
        delegado = new DistritoDelegate();
        dpto = new Departamento();
        provincia = new Provincia();
        realizarPagoFacade = new RealizarPagoDelegate();
        emplDelegado = new EmpleadoDelegate();
        citDelegado = new CuentIngresoTraDelegate();
        certificado = new Certificado();
        certDelegado = new CertificadoDelegate();
        movCuentaDelegado = new MovimientoCuentaDelegate();
        tipoDocDelegado = new TipoDocumentoDelegate();
        valorCuentaDelegado = new ValorCuentaDelegate();
        solRecepDelegado = new SolRecepDelegate();
        personaDelegado = new PersonaNaturalDelegate();
        delegadoTramite = new TramiteDelegate();
        colegiadoDelegado = new ColegiadoDelegate();
        delegadoDireccion = new DireccionDelegate();
        delegadoDocRequerido = new DocRequeridoDelegate();
        transaccionDelegado = new TransaccionDelegate();
        expedienteDelegado = new ExpedienteDelegate();
        documentoExtDelegado = new DocumentoExternoDelegate();
        operacionDelegado = new OperacionDelegate();
        documentoImaDelegado = new DocumentoImagenDelegate();
        docIncDelegado = new DocumentoIncluidoDelegate();
        dirRecepDelegado = new DirRecepDelegate();
        direccionNueva = new DireccionPersona();
        ubicacion = new DireccionPersona();
        empleado = new Empleado();
        tipoDocumento = new TipoDocumento();
        docRequeridos = new ArrayList<DocRequerido>();
        direccionSeleccionada = new DireccionPersona();
        listaTransacciones = new ArrayList<Transaccion>();
        setCuentasIngresoOp(new ArrayList<CuentaingresoTramite>());
        transaccion = new Transaccion();
        operacion = new Operacion();
        solicitante = new Solicitante();
        solicitado = new PersonaNatural();
        solicitado.setColegiado(new Colegiado());
        receptorPer = new PersonaNatural();
        cuentIngTram = new CuentaingresoTramite();
        areaDelegado = new AreaDelegate();
        cuentasIngresoGuard = new ArrayList<CuentaingresoTramite>();
        porcentaje = 0.0;
        activarHabilidad = false;
        cip = "";
        dni = "";
        sexo = "";
        cipSolicitante = "";
        destino = 1;
        receptor = 0;
        intSolicitado = 1;
        intPagante = 1;
        tipoDoc = 1;
        tipoDocSol = 1;
        tipoPersona = 0;
        tipoPersonaSol = 0;
//        direccion = "/modulos/tramite/img/";
        direccion = "D:\\Archivos\\";
        ruta = direccion;
        modal = false;
        costo = "";
        voucher = "";
        voucher2 = "";
        nomImagen1 = "";
        nomImagen2 = "";
        voucher1Activo = false;
        errorSolicitante = true;
        imprime = true;
        preformateado = true;
        rutaImagen = "";
        setVoucher2Activo(false);
        upFile = null;
        upFile2 = null;
        voucherCache = null;
        voucher2Visible = false;
        comboActivo = false;
        verNumVoucher1 = true;
        estadoCert = 1;
    }

    public SelectItem[] getDirecItems() {
        try {
            List<DireccionPersona> la = delegadoDireccion.listarXColegiado(solicitante.getSolCodigo());
            SelectItem[] select = new SelectItem[la.size()];
            int i = 0;
            for (DireccionPersona ev : la) {
                String direc = ev.getDpeDireccion();
                if (ev.getViaCodigo() != null) {
                    direc = ev.getViaCodigo().getViaAcronimo() + " " + ev.getDpeDireccion();
                }
                if (ev.getZonaCodigo() != null) {
                    direc = direc + " " + ev.getZonaCodigo().getZonNombre() + " " + ev.getDpenombreZona();
                }
                SelectItem item = new SelectItem(ev, direc);
                select[i++] = item;
            }
            return select;
        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Direcciones");
            select[0] = item;
            return select;
        }
    }

    public String anularCert() {
        certificado.setChaEstado(EnumEstadoCert.Anulado);
        certDelegado.edit(certificado);
        return "";
    }

    public String tramitar() {
        operAprob = false;
        int band = 0;
        documentosRecibidos = docIncDelegado.listarXOperacion(transaccion.getOperacionActiva());
        for (DocumentoIncluido doc : documentosRecibidos) {
            if (doc.getDicEstado() == 0 || doc.getDicEstado() == 2) {
                band = 1;
            }
            if (band == 0) {
                operAprob = true;
            }
            doc.getFkDocCodigo().setDocumentoImagen(documentoImaDelegado.find(doc.getFkDocCodigo().getDocCodigo()));
            if (doc.getFkDocCodigo().getDocumentoImagen() == null) {
                doc.setTipo(1);
            } else if (extImagen.contains(doc.getFkDocCodigo().getDocumentoImagen().getDimExt())) {
                doc.setTipo(2);
            } else if (extDoc.contains(doc.getFkDocCodigo().getDocumentoImagen().getDimExt())) {
                if (doc.getFkDocCodigo().getDocumentoImagen().getDimExt().equals("doc") || doc.getFkDocCodigo().getDocumentoImagen().getDimExt().equals("docx")) {
                    doc.setTipo(3);
                    doc.getFkDocCodigo().getDocumentoImagen().setAplication("msword");
                }
                if (doc.getFkDocCodigo().getDocumentoImagen().getDimExt().equals("pdf")) {
                    doc.setTipo(4);
                    doc.getFkDocCodigo().getDocumentoImagen().setAplication("pdf");
                }
                if (doc.getFkDocCodigo().getDocumentoImagen().getDimExt().equals("xls") || doc.getFkDocCodigo().getDocumentoImagen().getDimExt().equals("xlsx")) {
                    doc.setTipo(5);
                    doc.getFkDocCodigo().getDocumentoImagen().setAplication("vnd.ms-excel");
                }
            }
        }
        return "ver";
    }

    public String ver() {
        movimientoCuentas = movCuentaDelegado.deudaXTramite(transaccion);
        setCuentaIngresoTra(transaccion.getFkTrmCodigo().getCuentaingresoTramiteCollection());
        for (CuentaingresoTramite ciTrm : cuentaIngresoTra) {
            ciTrm.setValorCuenta(valorCuentaDelegado.valorCuentaActual(ciTrm.getFkCinCodigo().getCinCodigo()));
        }
        List<DocumentoIncluido> documentIncluidos = new ArrayList<DocumentoIncluido>();
        documentIncluidos = docIncDelegado.listarXOperacion(transaccion.getOperacionActiva());
        documentosRecibidos = new ArrayList<DocumentoIncluido>();
        for (DocumentoIncluido doc : documentIncluidos) {
            if (doc.getFkDocCodigo().getFkTdoCodigo().getTdoDesc().equals("Voucher")) {
                doc.getFkDocCodigo().setDocumentoImagen(documentoImaDelegado.find(doc.getFkDocCodigo().getDocCodigo()));
                if (doc.getFkDocCodigo().getDocumentoImagen() == null) {
                    doc.setTipo(1);
                } else if (extImagen.contains(doc.getFkDocCodigo().getDocumentoImagen().getDimExt())) {
                    doc.setTipo(2);
                } else {
                    doc.setTipo(3);
                }
                documentosRecibidos.add(doc);
            }
        }
        return "ver";
    }

    public Short getDestino() {
        return destino;
    }

    public void setDestino(Short destino) {
        if (destino != 1) {
            setReceptor(new Short("0"));
        }
        this.destino = destino;
    }

    public Short getReceptor() {
        return receptor;
    }

    public void setReceptor(Short receptor) {
        this.receptor = receptor;
    }

    public String getInicioCobro() {
        listarTransacciones();
        return "";
    }

    public void setInicioCobro(String s) {
    }

    public String getInicioCertificados() {
        if (tramites == null) {
            tramites = new ArrayList<Tramite>();
        }
        return "";
    }

    public void setInicioCertificados(String s) {
    }

    public String listarCertificados() {
        docGenDelegado = new DocumentoGeneradoDelegate();
        if (comboActivo) {
            tramite = null;
        }
        if (estadoCert == 1) {
            documentosRecibidos = docGenDelegado.listarCertificadosExpor(fechIni, fechFin, tramite, null);
        } else if (estadoCert == 3) {
            documentosRecibidos = docGenDelegado.listarCertificadosExpor(fechIni, fechFin, tramite, EnumEstadoCert.Entregado);
        } else if (estadoCert == 0) {
            documentosRecibidos = docGenDelegado.listarCertificadosExpor(fechIni, fechFin, tramite, EnumEstadoCert.Anulado);
        }
        if (documentosRecibidos.size() < 1) {
            mostrarMensaje("", "no se encontraron certificados ", FacesMessage.SEVERITY_WARN);
        }
        if (tramite == null) {
            tramite = new Tramite();
        }
        return "";
    }

    public String listarDocExter() {
        if (estadoCert == 2) {
            listaTransacciones = transaccionDelegado.listarDocExtExpor(fechIni, fechFin, false, null);
        } else if (estadoCert == 0) {
            listaTransacciones = transaccionDelegado.listarDocExtExpor(fechIni, fechFin, false, 1);
        } else {
            listaTransacciones = transaccionDelegado.listarDocExtExpor(fechIni, fechFin, true, 1);
        }

        if (listaTransacciones.size() < 1) {
            mostrarMensaje("", "no se encontraron Solicitudes ", FacesMessage.SEVERITY_WARN);
        } else {
            for (Transaccion t : listaTransacciones) {
                if (t.getTraEstado()) {
                    t.setEstado("Tramitado");
                } else {
                    t.setEstado("Iniciado");
                }
            }
        }
        return "";
    }
    private Long nroExped;

    public String seguimientoDocExter() {
        listaTransacciones = transaccionDelegado.listarDocExtSeg(fechIni, fechFin, nroExped);
        if (listaTransacciones.size() < 1) {
            mostrarMensaje("", "no se encontraron Solicitudes ", FacesMessage.SEVERITY_WARN);
        } else {
            for (Transaccion t : listaTransacciones) {
                if (t.getTraEstado()) {
                    t.setEstado("Tramitado");
                } else {
                    t.setEstado("Iniciado");
                }
            }
        }
        return "";
    }

    public String reportePdfCert() {
        jasper = new JasperController();
        jasper.reporteCertificado();
        return "";
    }

    public String reportePdfDocExt() {
        jasper = new JasperController();
        jasper.reporteDocExter();
        return "";
    }

    public String buscarCertificados() {
        if (tipoDoc == 1) {
            try {
                if (!dniSolicitante.isEmpty()) {
                    if (dniSolicitante.length() < 11) {
                        solicitantePer = personaDelegado.buscarXDni(dniSolicitante);
                        solicitante = solicitanteEmp;
                    } else {
                        solicitanteEmp = perJurDelegado.buscaJuridicaPorRuc(dniSolicitante);
                        solicitante = solicitantePer;
                    }
                } else {
                    solicitante = null;
                }
            } catch (NoResultException e) {
                solicitante = null;
            }
        } else {
            try {
                if (!cipSolicitante.isEmpty()) {
                    solicitante = colegiadoDelegado.colegiadoPersona(cipSolicitante).getPersonaNatural();
                } else {
                    solicitante = null;
                }
            } catch (NoResultException e) {
                solicitante = null;
            } catch (NullPointerException e) {
                solicitante = null;
            }
        }
        if (tipoDocSol == 1) {
            try {
                if (!dni.isEmpty()) {
                    solicitado = colegiadoDelegado.colegiadoPersonaDNI(dni).getPersonaNatural();
                } else {
                    solicitado = null;
                }
            } catch (NoResultException e) {
                solicitado = null;
            } catch (NullPointerException e) {
                solicitado = null;
            }
        } else {
            try {
                if (!cip.isEmpty()) {
                    solicitado = colegiadoDelegado.buscaPorCip(cip).getPersonaNatural();
                } else {
                    solicitado = null;
                }
            } catch (NoResultException e) {
                solicitado = null;
            } catch (NullPointerException e) {
                solicitado = null;
            }
        }
        if (tramite != null) {
            docGenDelegado = new DocumentoGeneradoDelegate();
            documentosRecibidos = docGenDelegado.listarCertificados(null, null, solicitante, solicitado, tramite, NroCert2);
            solicitante = new Solicitante();
            solicitado = new PersonaNatural();
            solicitado.setColegiado(new Colegiado());
            if (documentosRecibidos.size() < 1) {
                mostrarMensaje("", "no se encontraron certificados ", FacesMessage.SEVERITY_WARN);
                return "";
            }
            for (DocumentoIncluido di : documentosRecibidos) {
                if (di.getFkDocCodigo().getCertificado() == null) {
                    Certificado certi = certDelegado.buscar(di.getFkDocCodigo().getDocCodigo());
                    DocumentoGenerado doc = certi.getDocumentoGenerado();
                    doc.setCertificado(certi);
                    di.setFkDocCodigo(doc);
                }
                if (di.getFkDocCodigo().getCertificado().getChaEstado().equals(EnumEstadoCert.Generado)) {
                    di.setTipo(1);
                    List<MovimientoCuenta> mov = movCuentaDelegado.deudaXTramite(di.getFkOpeCodigo().getFkTraCodigo());
                    if (di.getFkDocCodigo().getFkTdoCodigo().getTdoDesc().equals(certObras)) {
                        if (mov.size() > 0) {
                            di.getFkDocCodigo().getCertificado().setChaEstado(EnumEstadoCert.Pagado);
                            di.getFkDocCodigo().getCertificado().setChaFechemision(new Date());
                            Colegiado col = colegiadoDelegado.buscaPorCip(di.getFkOpeCodigo().getFkTraCodigo().getFkSolicitado().getNumeroCIP());
                            di.getFkDocCodigo().getCertificado().setChaFechvigencia(col.getColfechaHabilidad());
                            certDelegado.edit(di.getFkDocCodigo().getCertificado());
                        }
                    } else {
                        if (mov.size() >= di.getFkOpeCodigo().getFkTraCodigo().getFkTrmCodigo().getCuentaingresoTramiteCollection().size()) {
                            di.getFkDocCodigo().getCertificado().setChaEstado(EnumEstadoCert.Pagado);
                            di.getFkDocCodigo().getCertificado().setChaFechemision(new Date());
                            Colegiado col = colegiadoDelegado.buscaPorCip(di.getFkOpeCodigo().getFkTraCodigo().getFkSolicitado().getNumeroCIP());
                            di.getFkDocCodigo().getCertificado().setChaFechvigencia(col.getColfechaHabilidad());
                            certDelegado.edit(di.getFkDocCodigo().getCertificado());
                        }
                    }
                }
                if (di.getFkDocCodigo().getCertificado().getChaEstado().equals(EnumEstadoCert.Pagado)) {
                    di.setTipo(2);
                } else if (di.getFkDocCodigo().getCertificado().getChaEstado().equals(EnumEstadoCert.Entregado)) {
                    di.setTipo(3);
                }
            }
        } else {
            mostrarMensaje("", "Debe elegir un certificado", FacesMessage.SEVERITY_ERROR);
        }


        return "";
    }

    public SelectItem[] getCertificadosItems() {
        try {
            tramites = delegadoTramite.listarXTipo(EnumTipoTramite.Certificado);
            SelectItem[] select = new SelectItem[tramites.size()];
            int i = 0;

            for (Tramite tra : tramites) {
                SelectItem item = new SelectItem(tra, tra.getTrmNombre());
                select[i++] = item;
            }

            return select;

        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Certificados");
            select[0] = item;
            return select;
        }
    }

    public String getInicioBandeja() {

        return listarTransXEmpleado();
    }

    public void setInicioBandeja(String s) {
    }

    public String listarTransacciones() {
        try {
            listaTransacciones = new ArrayList<Transaccion>();
            transaccionDelegado = new TransaccionDelegate();
            listaTransacciones = transaccionDelegado.listarTransaccionXCobro();
            return "buscar";
        } catch (Exception e) {
            mostrarMensaje("Mal", e.getMessage(), FacesMessage.SEVERITY_ERROR);
            return "buscar";
        }
    }

    public String listarTransXEmpleado() {
        try {
            setListaTransacciones(transaccionDelegado.listarXEmpleado(empleado.getFkPerCodigopna()));
            for (Transaccion tra : listaTransacciones) {
                if (tra.getOperacionActiva().getOpeEstado().equals(EnumEstadoOperacion.Iniciado)) {
                    tra.getOperacionActiva().setOpeEstado(EnumEstadoOperacion.recepcionado);
                    tra.getOperacionActiva().setOpeFechRecep(new Date());
                    operacionDelegado.edit(tra.getOperacionActiva());
                }
            }
            return "buscar";
        } catch (Exception e) {
            mostrarMensaje("Mal", e.getMessage(), FacesMessage.SEVERITY_ERROR);
            return "buscar";
        }
    }

    public String listarTransaccionesXUsuario() {
        try {
            setListaTransacciones(transaccionDelegado.listarXSolicitante(solicitante.getSolCodigo()));
            return "buscar";
        } catch (Exception e) {
            mostrarMensaje("Mal", e.getMessage(), FacesMessage.SEVERITY_ERROR);
            return "buscar";
        }
    }
    private Solicitante pagante;

    public String validaFechHabil() {
        errorSolicitante = false;
        imprimeDoc = false;

        if (solicitado.getColegiado().getColfechaHabilidad() != null) {
            if (!solicitado.getColegiado().getColCondicion()) {
                imprimeDoc = true;
                mostrarMensaje("", "El Solicitado no se encuentra Habil", FacesMessage.SEVERITY_ERROR);
                errorSol = "El Solicitado no se encuentra Habil";
            } else {
                if (tipoDocumento == null) {
                    errorSolicitante = true;
                    imprimeDoc = true;
                }
                errorSol = "";
            }
        } else {
            errorSolicitante = true;
            imprimeDoc = true;
            mostrarMensaje("", "La fecha de Habilidad del colegiado no esta actualizado", FacesMessage.SEVERITY_ERROR);
        }
        return "";
    }

    public String cambiarPagante() {
        if (intPagante == 1) {
            if (solicitante instanceof PersonaJuridica) {
                if (tipoDocumento.getTdoDesc().toUpperCase().equals("RECIBO")) {
                    errorSolicitante = true;
                    imprimeDoc = true;
                    mostrarMensaje("", "No se puede emitir Recibo a una Persona Juridica, cambiar Tipo Doc. Pago", FacesMessage.SEVERITY_WARN);
                }
            }
        }
        if (solicitado != null) {
            if (solicitado.getColegiado() != null) {
                if (solicitado.getColegiado().getTipoColegiado() != null) {
                    calculaMonto();
                }
            }
        }
        return "";
    }

    public void ListarSellos() {
        try {
            setListaSellos(colImagenDelegado.listaSellos(solicitado.getSolCodigo()));
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }

    public String muestraFirma() {
        try {
            setColFirma(new ColegiadoImagen());
            setColFirma(colImagenDelegado.buscaFiram(solicitado.getSolCodigo()));
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return null;
    }
    private ColegiadoImagen colFoto, colFirma;
    private List<ColegiadoImagen> listaSellos;

    public String muestraFoto() {
        try {
            setColFoto(new ColegiadoImagen());
            setColFoto(colImagenDelegado.buscaFoto(solicitado.getSolCodigo()));
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return null;
    }

    public String buscarSolicitado() {
        if (!imprime) {
            mostrarMensaje("", "No puede generar otro certificado: Tiene un certificado pendiente de inpresion, imprimalo o de en cancelar", FacesMessage.SEVERITY_ERROR);
            return "";
        } else {
            try {
                errorSolicitante = false;
                solicitado = new PersonaNatural();
                if (intSolicitado != 1) {
                    if (tipoDocSol == 1) {
                        if (dni.length() > 7 && !dni.isEmpty()) {
                            solicitado = colegiadoDelegado.colegiadoPersonaDNI(dni).getPersonaNatural();
                        }
                    } else if (cip.length() < 7 && !cip.isEmpty()) {
                        solicitado = colegiadoDelegado.buscaPorCip(cip).getPersonaNatural();
                    }
                } else {
                    cip = "";
                    dni = "";
                    solicitado = solicitantePer;
                }
                muestraFirma();
                muestraFoto();
                ListarSellos();
                habPago();
            } catch (Exception e) {
                solicitado = new PersonaNatural();
                solicitado.setColegiado(new Colegiado());
                errorSolicitante = true;
                return "";
            }
        }
        return "";
    }

    public String buscarSolicitante() {
        try {
            solicitante = colegiadoDelegado.buscaPorCip(cipSolicitante).getPersonaNatural();
            buscarSolicitado();
        } catch (Exception e) {
            return "";
        }
        return "nuevo";
    }
    private boolean certif;
    private String NroCert;
    private String NroCert2;
    @EJB
    SecuenciaDocumentoFacadeLocal secuenciaFacade;

    private void getNroCertificado(TipoDocumento t, Area a) {
        Integer sec;
        SecuenciaDocumento secuencia = secuenciaFacade.buscarUltimoCert(t, a);

        if (secuencia == null) {
            sec = 1;
            NroCert = "000001";
        } else {
            sec = secuencia.getSdoSecuencia().intValue();
            sec++;
            if (sec < 10) {
                NroCert = "00000" + sec.toString();
            } else if (sec < 100) {
                NroCert = "0000" + sec.toString();
            } else if (sec < 1000) {
                NroCert = "000" + sec.toString();
            } else if (sec < 10000) {
                NroCert = "00" + sec.toString();
            } else if (sec < 100000) {
                NroCert = "0" + sec.toString();
            } else {
                NroCert = sec.toString();
            }
        }
    }
    private final static String certHabil = "Certificado de Habilidad Profesional";
    private final static String certConstruc = "Certificado de Habilidad de Expediente de Construcción";
    private final static String certObras = "Certificado Habilidad Firma de Contrato de Obras Publicas";

    public String getInicioHabil() {
        if (certificado.getCodDistrito() != null) {
            certificado.setCodDistrito(null);
        }
        cert = 1;
        certif = false;
        int i = 0;

        if (tipoDocDelegado.buscarXNombre("Certificado de Habilidad Profesional") == null) {
            mostrarMensaje("Configuracion : ", "El Tipo de Documento no existe, debe crearse en el modulo configuraciones", FacesMessage.SEVERITY_ERROR);
            i = 1;
        }
        tramite = delegadoTramite.buscar("Certificado de Habilidad Profesional");
        if (tramite == null) {
            mostrarMensaje("Configuracion : ", "El certificado no existe, debe crearse en el modulo de configuraciones", null);
            i = 1;
        }
        if (validarTram()) {
            i = 1;
        }
        if (i == 1) {
            certif = true;
            NroCert = "";
            return "";
        }
        getNroCertificado(tipoDocDelegado.buscarXNombre("Certificado de Habilidad Profesional"), areaDelegado.buscar("Trámite Documentario"));
        return "";
    }

    public void setInicioHabil(String s) {
    }

    public String getInicioObras() {
        cert = 3;
        certif = false;
        int i = 0;
        if (tipoDocDelegado.buscarXNombre("Certificado Habilidad Firma de Contrato de Obras Publicas") == null) {
            mostrarMensaje("Configuracion : ", "El Tipo de Documento no existe, debe crearse en el modulo configuraciones", FacesMessage.SEVERITY_ERROR);
            i = 1;
        }
        tramite = delegadoTramite.buscar("Certificado Habilidad Firma de Contrato de Obras Publicas");
        if (tramite == null) {
            mostrarMensaje("Configuracion : ", "El certificado no existe, debe crearse en el modulo de configuraciones", null);
            i = 1;
        }
        if (validarTram()) {
            i = 1;
        }
        if (i == 1) {
            certif = true;
            NroCert = "";
            return "";
        }
        getNroCertificado(tipoDocDelegado.buscarXNombre("Certificado Habilidad Firma de Contrato de Obras Publicas"), areaDelegado.buscar("Trámite Documentario"));
//        if (certificado.getCodPropietario() == null) {
//            certificado.setCodPropietario(new Solicitante());
//        }
        if (certificado.getCodDistrito() == null) {
            certificado.setCodDistrito(new Distrito());
        }
        return "";
    }

    public void setInicioObras(String s) {
    }

    public String getInicioConst() {
        try {
            cert = 2;
            certif = false;
            int i = 0;

            if (tipoDocDelegado.buscarXNombre("Certificado de Habilidad de Expediente de Construcción") == null) {
                mostrarMensaje("Configuracion : ", "El Tipo de Documento no existe, debe crearse en el modulo configuraciones", FacesMessage.SEVERITY_ERROR);
                i = 1;
            }
            tramite = delegadoTramite.buscar("Certificado de Habilidad de Expediente de Construcción");
            if (tramite == null) {
                mostrarMensaje("Configuracion : ", "El certificado no existe, debe crearse en el modulo de configuraciones", null);
                i = 1;
            }
            if (validarTram()) {
                i = 1;
            }
            if (i == 1) {
                certif = true;
                NroCert = "";
                return "";
            }
            getNroCertificado(tipoDocDelegado.buscarXNombre("Certificado de Habilidad de Expediente de Construcción"), areaDelegado.buscar("Trámite Documentario"));
//        if (certificado.getCodPropietario() == null) {
//            certificado.setCodPropietario(new Solicitante());
//        }
            if (certificado.getCodDistrito() == null) {
                certificado.setCodDistrito(new Distrito());
            }
        } catch (Exception e) {
            mostrarMensaje("", "1", FacesMessage.SEVERITY_ERROR);
        }

        return "";
    }

    public void setInicioConst(String s) {
    }

    public String buscarPropie() {
        if (dniProp.length() > 0 && !dniProp.isEmpty()) {
            if (dniProp.length() < 11) {
                certificado.setCodPropietario(personaDelegado.buscarXDni(dniProp));
            } else {
                certificado.setCodPropietario(perJurDelegado.buscaJuridicaPorRuc(dniProp));
            }
        }
        if (certificado.getCodPropietario() == null) {
            mostrarMensaje("", "No se encontro Propietario", FacesMessage.SEVERITY_WARN);
        }
        creoPersona = false;
        return "";
    }

    public String buscarRUC() {
        if (dniProp.length() > 0 && !dniProp.isEmpty()) {
            certificado.setCodPropietario(perJurDelegado.buscaJuridicaPorRuc(dniProp));
        }
        if (certificado.getCodPropietario() == null) {
            mostrarMensaje("", "No se encontro Propietario", FacesMessage.SEVERITY_WARN);
        }
        creoPersona = false;
        return "";
    }

    public String habPago() {
        try {
            if (intPagante == 1) {
                if (solicitante instanceof PersonaJuridica) {
                    if (tipoDocumento.getTdoDesc().toUpperCase().equals("RECIBO")) {
                        errorSolicitante = true;
                        imprimeDoc = true;
                        mostrarMensaje("", "No se puede emitir Recibo a una Persona Juridica, cambiar Tipo Doc. Pago", FacesMessage.SEVERITY_WARN);
                    } else {
                        validaPago();
                    }
                } else {
                    validaPago();
                }
            } else {
                validaPago();
            }
            if (cert == 3) {
                if (calcularMonto().isEmpty()) {
                    imprimeDoc = true;
                }
            }
            if (solicitado != null) {
                if (solicitado.getColegiado() != null) {
                    if (solicitado.getColegiado().getTipoColegiado() != null) {
                        calculaMonto();
                    }
                }
            }
        } catch (Exception e) {
            mostrarMensaje("", "2", FacesMessage.SEVERITY_ERROR);
        }
        return "";
    }

    public String buscarparaCert() {
        try {
            if (tipoDocSol == 1) {
                solicitado = colegiadoDelegado.colegiadoPersonaDNI(dni).getPersonaNatural();
            } else {
                solicitado = colegiadoDelegado.buscaPorCip(cip).getPersonaNatural();
            }
            validaPago();

        } catch (Exception e) {
            return "#";
        }
        return "#";
    }
    private boolean activarHabilidad;

    private void validaPago() {
        activarHabilidad = false;
        errorSolicitante = false;
        imprimeDoc = false;

        if (solicitado != null) {
            if (solicitado.getColegiado() != null) {
                if (cert == 1) {
                    if (solicitado.getColegiado().getColfechaIncorporacion() == null) {
                        mostrarMensaje("", "El Solicitado no tiene la Fecha de Incorporacion actualizado", FacesMessage.SEVERITY_ERROR);
                        imprimeDoc = true;
                        errorSolicitante = true;
                    }
                }
                if (solicitado.getColegiado().getTipoColegiado() != null) {
                    if (solicitado.getColegiado().getTipoColegiado().getTcoCodigo() == 2 || solicitado.getColegiado().getTipoColegiado().getTcoCodigo() == 4) {
                        activarHabilidad = true;
                    } else if (solicitado.getColegiado().getColfechaHabilidad() != null) {
                        if (!solicitado.getColegiado().getColCondicion()) {
                            imprimeDoc = true;
                            mostrarMensaje("", "El Solicitado no se encuentra Habil", FacesMessage.SEVERITY_ERROR);
                            errorSol = "El Solicitado no se encuentra Habil";
                        } else {
                            if (tipoDocumento == null) {
                                errorSolicitante = true;
                                imprimeDoc = true;
                            }
                            errorSol = "";
                        }
                    } else {
                        errorSolicitante = true;
                        imprimeDoc = true;
                        mostrarMensaje("", "La fecha de Habilidad del colegiado no esta actualizado", FacesMessage.SEVERITY_ERROR);
                    }
                }
            } else {
                solicitado = new PersonaNatural();
                solicitado.setColegiado(new Colegiado());
                errorSolicitante = true;
                imprimeDoc = true;
                mostrarMensaje("", "El Colegiado no existe", FacesMessage.SEVERITY_ERROR);
                errorSol = "El Colegiado no existe";
            }
        } else {
            solicitado = new PersonaNatural();
            solicitado.setColegiado(new Colegiado());
            imprimeDoc = true;
            setErrorSolicitante(true);
            mostrarMensaje("", "El Colegiado no existe", FacesMessage.SEVERITY_ERROR);
            errorSol = "El Colegiado no existe";
        }
    }
    @EJB
    IgvFacadeLocal igvFacadeLocal;

    private void calculaMonto() {
        try {
            if (cert < 3) {
                Double mont = 0.0;
                for (CuentaingresoTramite cit : cuentaIngresoTra) {
                    Double valor = 0.0;
                    Igv igvUsar = igvFacadeLocal.igvVigente();
                    Double valorIgvDecimal = 0.0;
                    if (igvUsar != null) {
                        valorIgvDecimal = igvUsar.getIgvValor() / 100;
                    } else {
                        ControladorAbstracto.warn("No existe Valor de IGV ingresado y habilitado.Registrelo primero.");
                    }
                    ValorCuenta v = new ValorCuenta();
                    v = valorCuentaDelegado.valorCuentaActual(cit.getFkCinCodigo().getCinCodigo());
                    if (solicitado instanceof PersonaNatural) {
                        PersonaNatural pn = (PersonaNatural) solicitado;
                        if (pn.getColegiado() != null) {
                            if (pn.getColegiado().getColesVitalicio()) {
                                if (tipoDocumento.getTdoDesc().toUpperCase().equals("RECIBO")) {
                                    valor = v.getVcuValorVitalicio() / (1 + valorIgvDecimal);
                                } else {
                                    valor = v.getVcuValorVitalicio();
                                }
                            } else if (pn.getColegiado().getTipoColegiado().getTcoCodigo() == 2 || pn.getColegiado().getTipoColegiado().getTcoCodigo() == 4) {
                                if (tipoDocumento.getTdoDesc().toUpperCase().equals("RECIBO")) {
                                    valor = v.getVcuValorOtroTipoColegiado() / (1 + valorIgvDecimal);
                                } else {
                                    valor = v.getVcuValorOtroTipoColegiado();
                                }
                            } else {
                                if (tipoDocumento.getTdoDesc().toUpperCase().equals("RECIBO")) {
                                    valor = v.getVcuValor() / (1 + valorIgvDecimal);
                                } else {
                                    valor = v.getVcuValor();
                                }
                            }
                        } else {
                            valor = v.getVcuValor();
                        }
                    } else {
                        valor = v.getVcuValor();
                    }
                    mont += valor * cit.getFkCinCodigo().getFkTmoCodigo().getCambioActual();
                }
                String patron = ("###,###,###.##");
                DecimalFormat myFormatter = new DecimalFormat(patron);
                montoPagar = myFormatter.format(mont);
                montoPagar = "S/. " + montoPagar;
            }
        } catch (Exception e) {
            mostrarMensaje("", "3", FacesMessage.SEVERITY_ERROR);
        }
    }

    public String buscarSolicitanteCip() {
        if (!imprime) {
            mostrarMensaje("", "No puede generar otro certificado: Tiene un certificado pendiente de inpresion, imprimalo o de en cancelar", FacesMessage.SEVERITY_ERROR);
            return "";
        } else {
            solicitante = new Solicitante();
            try {
                if (tipoDoc == 1) {
                    if (dniSolicitante.length() > 7 && !dniSolicitante.isEmpty()) {
                        if (dniSolicitante.length() < 11) {
                            solicitantePer = personaDelegado.buscarXDni(dniSolicitante);
                            solicitante = solicitantePer;
                        } else {
                            solicitanteEmp = perJurDelegado.buscaJuridicaPorRuc(dniSolicitante);
                            solicitante = solicitanteEmp;
                        }
                    } else {
                        mostrarMensaje("", "El numero de documento debe ser mayor o igual de 8", FacesMessage.SEVERITY_WARN);
                    }
                } else if (cipSolicitante.length() < 7 && !cipSolicitante.isEmpty()) {
                    solicitantePer = colegiadoDelegado.colegiadoPersona(cipSolicitante).getPersonaNatural();
                    solicitante = solicitantePer;
                }
                if (solicitante == null) {
                    mostrarMensaje("", "No se encontro al solicitante", FacesMessage.SEVERITY_WARN);

                } else {
                    if (intSolicitado == 1) {
                        if (solicitante instanceof PersonaNatural) {
                            if (solicitantePer.getPerTipo() == 1) {
                                buscarSolicitado();
                            } else {
                                habPago();
                            }
                        }
                    } else if (solicitante instanceof PersonaNatural) {
                        habPago();
                    }
                }
            } catch (Exception e) {
                mostrarMensaje("", "No se encontro al solicitante", FacesMessage.SEVERITY_WARN);
                solicitado = new PersonaNatural();
                solicitado.setColegiado(new Colegiado());
                return "";
            }
        }
        return "";
    }

    public String buscarReceptor() {
        try {
            receptorPer = personaDelegado.buscarXDni(dniReceptor);
        } catch (Exception e) {
            return "";
        }
        return "nuevo";
    }

    public String nuevoSol() {
//        modalPer = true;
        solicitanteEmp = new PersonaJuridica();
        solicitantePer = new PersonaNatural();
        return "nuevo";
    }

    public String nuevoProp() {
        propietario = new PersonaNatural();
        persJuridica = new PersonaJuridica();
        modalProp = true;
        return "prop";
    }

    public String nuevoRecep() {
        modalRecp = true;
        return "";
    }

    public String cancelarModalEmp() {
        modalProp = false;
        return "cert";
    }

    public String aceptarModalEmp() {
        if (!persJuridica.getEmprazonSocial().isEmpty()) {
            if (persJuridica.getSolRUC().isEmpty()) {
                mostrarMensaje("Error: ", "No se creo al propietario por que no se ingresaron correctamente los datos", FacesMessage.SEVERITY_WARN);
            } else {
                if (perJurDelegado.buscaJuridicaPorRuc(persJuridica.getSolRUC()) != null) {
                    mostrarMensaje("Duplicado: ", "El propietario ya existe", FacesMessage.SEVERITY_WARN);
                } else {
                    creoPersona = true;
                    persJuridica.setSolEstado(EnumEstadoSolicitante.Activa);
                    dniProp = persJuridica.getSolRUC();
                    certificado.setCodPropietario(persJuridica);
                }
            }
        } else {
            mostrarMensaje("Error: ", "No se creo al propietario por que no se ingresaron correctamente los datos", FacesMessage.SEVERITY_WARN);
        }
        modalProp = false;
        return "cert";
    }
    private boolean creoPersona;

    public String aceptarModalProp() {
        if (propietario.getPerapellidoMaterno().isEmpty() || propietario.getPerapellidoPaterno().isEmpty() || propietario.getPerNombres().isEmpty() || propietario.getPerNroDNI().isEmpty()) {
            mostrarMensaje("", "El Propietario no se creo por que faltan datos", FacesMessage.SEVERITY_WARN);
        } else {
            if (personaDelegado.buscarXDni(propietario.getPerNroDNI()) != null) {
                mostrarMensaje("Duplicado: ", "El propietario ya existe", FacesMessage.SEVERITY_WARN);
            } else {
                dniProp = propietario.getPerNroDNI();
                propietario.setPerTipo(0);
                if (sexo.equals("1")) {
                    propietario.setPerSexo(true);
                } else {
                    propietario.setPerSexo(false);
                }
                propietario.setSolEstado(EnumEstadoSolicitante.Activa);
                creoPersona = true;
                certificado.setCodPropietario(propietario);
            }
        }
        modalProp = false;
        return "cert";
    }

    public String cancelarModalSol() {
        if (cert == 1) {
            return "hab";
        } else if (cert == 2) {
            return "cons";
        } else {
            return "obr";
        }
    }
    private PersonaJuridica perJur;

    public String aceptarModalSolEmp() {
        if (solicitanteEmp.getRubCodigo().getRubCodigo() != 0) {
            if (!solicitanteEmp.getEmprazonSocial().isEmpty()) {
                if (solicitanteEmp.getSolRUC().isEmpty()) {
                    mostrarMensaje("Error: ", "No se creo al Solicitante por que no se ingresaron correctamente los datos", FacesMessage.SEVERITY_WARN);
                } else {
                    if (perJurDelegado.buscaJuridicaPorRuc(solicitanteEmp.getSolRUC()) != null) {
                        mostrarMensaje("Duplicado: ", "El Solicitante ya existe", FacesMessage.SEVERITY_WARN);
                    } else {
                        creoSol = true;
                        solicitanteEmp.setSolEstado(EnumEstadoSolicitante.Activa);
                        dniSolicitante = solicitanteEmp.getSolRUC();
                        solicitante = solicitanteEmp;
                    }
                }
            } else {
                mostrarMensaje("Error: ", "No se creo al Solicitante por que no se ingresaron correctamente los datos", FacesMessage.SEVERITY_WARN);
            }
        } else {
            mostrarMensaje("Error", "No selecciono un Rubro", FacesMessage.SEVERITY_ERROR);
        }
        modalProp = false;
        if (cert == 1) {
            return "hab";
        } else if (cert == 2) {
            return "cons";
        } else {
            return "obr";
        }
    }

    public String aceptarModalSol() {
//        modalPer = false;
        if (solicitantePer.getPerapellidoMaterno().isEmpty() || solicitantePer.getPerapellidoPaterno().isEmpty() || solicitantePer.getPerNombres().isEmpty() || solicitantePer.getPerNroDNI().isEmpty()) {
            mostrarMensaje("", "La persona no se creo por que faltan datos", FacesMessage.SEVERITY_WARN);
        } else {
            if (personaDelegado.buscarXDni(solicitantePer.getPerNroDNI()) != null) {
                mostrarMensaje("Duplicado: ", "La persona ya existe", FacesMessage.SEVERITY_WARN);
            } else {
                dniSolicitante = solicitantePer.getPerNroDNI();
                solicitantePer.setPerTipo(0);
                solicitantePer.setSolEstado(EnumEstadoSolicitante.Activa);
                if (sexoSol.equals("1")) {
                    solicitantePer.setPerSexo(true);
                } else {
                    solicitantePer.setPerSexo(false);
                }
                creoSol = true;
                solicitante = solicitantePer;
            }
        }
        if (cert == 1) {
            return "hab";
        } else if (cert == 2) {
            return "cons";
        } else {
            return "obr";
        }
    }
    private boolean creoSol;

    public String aceptarModalCI() {
        for (CuentaingresoTramite ci : getCuentasIngresoOp()) {
            cuentaIngresoTra.remove(ci);
            cuentasIngresoGuard.add(ci);
        }
        if (getCuentasIngresoOp().size() > 0) {
            docRequeridoCargado.setCuentaIngresoT(getPagosVoucherItems(getCuentasIngresoOp()));
            docRequeridoCargado.setCiTramite(new CuentaingresoTramite());
            docCargados.add(docRequeridoCargado);
        }
        modalCI = false;
        cuentasIngresoOp.clear();
        return "#";
    }

    public String cancelarModalCI() {
        modalCI = false;
        return "#";
    }

    public String cancelarModalRecep() {
        modalRecp = false;
        return "#";
    }

    public String aceptarModalRecep() {
        receptorPer.setPerTipo(0);
        if (sexo.equals("1")) {
            receptorPer.setPerSexo(true);
        } else {
            receptorPer.setPerSexo(false);
        }
//        personaDelegado.create(receptorPer);
        modalRecp = false;
        return "";
    }

    private void grabarImg(DocRequerido doc, String nombre) {
        try {
            String extencion;
            String archivo;
            documentoExterno = new DocumentoExterno();
            documentoExterno.setDocSerie(doc.getGlosa());
            documentoExterno.setDocFecha(new Date());
            documentoExterno.setFkTdoCodigo(doc.getFkTdoCodigo());
            documentoExterno.setDocNumero(doc.getGlosa());
            documentoExterno.setDocEstado(1);
            documentoExtDelegado.create(documentoExterno);
            extencion = doc.getUpFile().getName().substring(doc.getUpFile().getName().length() - 4, doc.getUpFile().getName().length());
            archivo = documentoExterno.getDocCodigo().toString();
//            FileInputStream file = new FileInputStream("");
            InputStream stream = doc.getUpFile().getInputStream();
            OutputStream out = new FileOutputStream(direccion.concat(archivo.concat(extencion)));
            long size = doc.getUpFile().getSize();
            byte[] buffer = new byte[(int) size];
            stream.read(buffer, 0, (int) size);
            out.write(buffer, 0, (int) size);
            stream.close();
            out.close();

            setDocImagen(new DocumentoImagen(getDocumentoExterno().getDocCodigo(), nombre, getRuta().concat(archivo.concat(extencion))));
            DocImagen.setDimExt(extencion.substring(1, 4));
            documentoImaDelegado.create(getDocImagen());

            docIncluido = new DocumentoIncluido();
            docIncluido.setDicObservacion("");
            docIncluido.setFkExpCodigo(expediente);
            docIncluido.setFkOpeCodigo(operacion);
            docIncluido.setFkDocCodigo(documentoExterno);
            docIncluido.setDicLectura(doc.getDreLectura());
            docIncDelegado.create(docIncluido);
            System.out.println("File Upload Successful.");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            mostrarMensaje("Mal", "Los Archivos no se grabaron", FacesMessage.SEVERITY_ERROR);
        }
    }

    private void grabarDoc(DocRequerido doc) {
        try {
            documentoExterno = new DocumentoExterno();
            documentoExterno.setDocSerie(doc.getGlosa());
            documentoExterno.setDocFecha(new Date());
            documentoExterno.setFkTdoCodigo(doc.getFkTdoCodigo());
            documentoExterno.setDocNumero(doc.getGlosa());
            documentoExterno.setDocEstado(1);
            documentoExtDelegado.create(documentoExterno);

            docIncluido = new DocumentoIncluido();
            docIncluido.setDicObservacion("");
            docIncluido.setFkExpCodigo(expediente);
            docIncluido.setFkOpeCodigo(operacion);
            docIncluido.setFkDocCodigo(documentoExterno);
            docIncluido.setDicLectura(doc.getDreLectura());
            docIncDelegado.create(docIncluido);
            System.out.println("File Upload Successful.");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            mostrarMensaje("Mal", "Los Archivos no se grabaron", FacesMessage.SEVERITY_ERROR);
        }
    }
    private DocumentoPago docPago;

    private void grabarTransaccion() {
        try {
            int i = 1;
            expedienteDelegado.create(expediente);
            transaccion.setFkExpCodigo(expediente);
            transaccion.setOperacionActiva(new Operacion(sexo));
            transaccionDelegado.create(transaccion);
            operacion = operacionDelegado.crearOperacion(transaccion);
            if (tramiteCip) {
                operacion.setOpeDescripcion("Pago CIP");
                operacionDelegado.edit(operacion);
                for (DocRequerido doc : docRequeridos) {
                    grabarDoc(doc);
                }
                if (getCuentaIngresoTra() != null) {
                    if (getCuentaIngresoTra().size() < 1) {
                        transaccion.setOperacionActiva(operacion);
                        operacionDelegado.Aprobar(transaccion);
                    } else {
                        List<CuentaIngreso> cuentasIngreso;
                        cuentasIngreso = new ArrayList<CuentaIngreso>();
                        for (CuentaingresoTramite cui : cuentaIngresoTra) {
                            if (!cui.getCitOpcional()) {
                                cuentasIngreso.add(cui.getFkCinCodigo());
                            }
                        }
                        if (getCuentasIngresoOp() != null) {
                            for (CuentaingresoTramite cui : getCuentasIngresoOp()) {
                                if (cui.getCitOpcional()) {
                                    cuentasIngreso.add(cui.getFkCinCodigo());
                                }
                            }
                        }
                    }
                } else {
                    transaccion.setOperacionActiva(operacion);
                    operacionDelegado.Aprobar(transaccion);
                }
            } else {
                for (DocRequerido doc : docCargados) {
                    if (doc.getFkTdoCodigo().getTdoDesc().equals("Voucher")) {
                        grabarImg(doc, "Documento de Pago");
                    } else {
                        grabarImg(doc, doc.getFkTdoCodigo().getTdoDesc() + i++);
                    }
                }
                if (cuentasIngresoGuard != null) {
                    if (cuentasIngresoGuard.size() < 1) {
                        transaccion.setOperacionActiva(operacion);
                        operacionDelegado.Aprobar(transaccion);
                    } else {
                        List<CuentaIngreso> cuentasIngreso;
                        cuentasIngreso = new ArrayList<CuentaIngreso>();
                        for (CuentaingresoTramite cui : cuentasIngresoGuard) {
                            cuentasIngreso.add(cui.getFkCinCodigo());
                        }
                        movCuentaDelegado.crearDeudaTramite(cuentasIngreso, solicitante, new Date(), transaccion, tipoDocumento, certificado.getChaCostoobra().doubleValue(), tipoMoneda);
                    }
                } else {
                    transaccion.setOperacionActiva(operacion);
                    operacionDelegado.Aprobar(transaccion);
                }
            }
        } catch (Exception e) {
            mostrarMensaje(e.toString(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
    }
    private RutaCarpetaReporte rutas = new RutaCarpetaReporte();
    private String rutaJasper = "";
    private DirectivosDelegate directDelegado;

    private boolean validarTram() {
        directDelegado = new DirectivosDelegate();
        boolean error = false;
        if (areaDelegado.buscar("Trámite Documentario") == null) {
            mostrarMensaje("Configuracion : ", "El area Tramite Documentario no existe, debe crearse en el modulo configuraciones", FacesMessage.SEVERITY_ERROR);
            error = true;
        }
        if (directDelegado.buscaDecano() == null) {
        }

        cuentaIngresoTra = citDelegado.listarXTramite(tramite);
        if (cuentaIngresoTra.size() < 1) {
            mostrarMensaje("Configuracion : ", "El tramite no cuenta con cuentas de ingresos debe modificarlo en cel modulo de configuraciones", FacesMessage.SEVERITY_ERROR);
            error = true;
        }
        return error;
    }

    public String grabarHabilidad() {
        if (intPagante == 1) {
            if (delegadoDireccion.buscaDireccionColegiado(solicitante.getSolCodigo()) == null) {
                mostrarMensaje("", "El solicitante no cuenta con direccion para generar su documento de pago", null);
                return "";
            }
        } else if (delegadoDireccion.buscaDireccionColegiado(solicitado.getSolCodigo()) == null) {
            mostrarMensaje("", "El solicitante no cuenta con direccion para generar su documento de pago", null);
            return "";
        }
        if (!errorSolicitante) {
            grabarTraCert();
            getDocGenerado().setFkTdoCodigo(tipoDocDelegado.buscarXNombre("Certificado de Habilidad Profesional"));
            getDocGenerado().setArea(areaDelegado.buscar("Tramite Documentario"));
            guardarCertificado();
        } else {
            mostrarMensaje("solicitante : ", "Existe un error con el solicitante", FacesMessage.SEVERITY_ERROR);
        }
        return "";
    }

    public String grabarConst() {
        if (intPagante == 1) {
            if (delegadoDireccion.buscaDireccionColegiado(solicitante.getSolCodigo()) == null) {
                mostrarMensaje("", "El solicitante no cuenta con direccion para generar su documento de pago", null);
                return "";
            }
        } else if (delegadoDireccion.buscaDireccionColegiado(solicitado.getSolCodigo()) == null) {
            mostrarMensaje("", "El solicitado no cuenta con direccion para generar su documento de pago", null);
            return "";
        }
        if (!errorSolicitante) {
            if (certificado.getCodDistrito() != null) {
//                if (creoPersona) {
//                    try {
//                        if (tipoPersona == 0) {
//                            personaDelegado.create(propietario);
//                            certificado.setCodPropietario(propietario);
//                        } else {
//                            perJurDelegado.create(persJuridica);
//                            certificado.setCodPropietario(persJuridica);
//                        }
//                    } catch (Exception e) {
//                        mostrarMensaje("Propietario : ", "Ocurrio un error al registar al propietario, verifique que el propietario no este ya registrado", FacesMessage.SEVERITY_ERROR);
//                        return "";
//                    }
//                }
//                if (certificado.getCodPropietario() == null) {
//                    mostrarMensaje("Propietario : ", "No ha seleccionado un propietario", FacesMessage.SEVERITY_ERROR);
//                    return "";
//                } else if (certificado.getCodPropietario().getSolCodigo() == null) {
//                    mostrarMensaje("Propietario : ", "No ha seleccionado un propietario", FacesMessage.SEVERITY_ERROR);
//                    return "";
//                }
                grabarTraCert();
                getDocGenerado().setFkTdoCodigo(tipoDocDelegado.buscarXNombre("Certificado de Habilidad de Expediente de Construcción"));
                getDocGenerado().setArea(areaDelegado.buscar("Tramite Documentario"));
                guardarCertificado();
            } else {
                mostrarMensaje("Direccion : ", "Debe seleccionar un distrito", FacesMessage.SEVERITY_ERROR);
            }
        } else {
            mostrarMensaje("solicitante : ", "Existe un error con el solicitante", FacesMessage.SEVERITY_ERROR);
        }
        return "";
    }

    public String grabarObras() {
        try {
            certificado.setChaCostoobra(new BigDecimal(costo.replace(" ", "")));
        } catch (Exception e) {
            mostrarMensaje("Costo : ", "Debe ingresar un monto de obra correcto", FacesMessage.SEVERITY_ERROR);
            return "";
        }
        if (intPagante == 1) {
            if (delegadoDireccion.buscaDireccionColegiado(solicitante.getSolCodigo()) == null) {
                mostrarMensaje("", "El solicitante no cuenta con direccion para generar su documento de pago", null);
                return "";
            }
        } else if (delegadoDireccion.buscaDireccionColegiado(solicitado.getSolCodigo()) == null) {
            mostrarMensaje("", "El solicitante no cuenta con direccion para generar su documento de pago", null);
            return "";
        }
        if (!errorSolicitante) {
            if (certificado.getCodDistrito() != null) {
                Double monto;
                if (certificado.getChaCostoobra() == null) {
                    mostrarMensaje("Costo : ", "Debe ingresar un monto de obra correcto", FacesMessage.SEVERITY_ERROR);
                    return "";
                } else {
                    try {
                        monto = certificado.getChaCostoobra().doubleValue();
                    } catch (Exception e) {
                        mostrarMensaje("Costo : ", "Debe ingresar un monto de obra correcto", FacesMessage.SEVERITY_ERROR);
                        return "";
                    }
                }
//                if (creoPersona) {
//                    try {
//                        perJurDelegado.create(persJuridica);
//                        certificado.setCodPropietario(persJuridica);
//                    } catch (Exception e) {
//                        mostrarMensaje("Propietario : ", "Ocurrio un error al registar al propietario, verifique que el propietario no este ya registrado", FacesMessage.SEVERITY_ERROR);
//                    }
//                }
//                if (certificado.getCodPropietario() == null) {
//                    mostrarMensaje("Propietario : ", "No ha seleccionado un propietario", FacesMessage.SEVERITY_ERROR);
//                    return "";
//                } else if (certificado.getCodPropietario().getSolCodigo() == null) {
//                    mostrarMensaje("Propietario : ", "No ha seleccionado un propietario", FacesMessage.SEVERITY_ERROR);
//                    return "";
//                }
                grabarTraCert();
                getDocGenerado().setFkTdoCodigo(tipoDocDelegado.buscarXNombre("Certificado Habilidad Firma de Contrato de Obras Publicas"));
                getDocGenerado().setArea(areaDelegado.buscar("Tramite Documentario"));
                guardarCertificado();
            } else {
                mostrarMensaje("Direccion : ", "Debe seleccionar un distrito", FacesMessage.SEVERITY_ERROR);
            }
        } else {
            mostrarMensaje("solicitante : ", "Existe un error con el solicitante", FacesMessage.SEVERITY_ERROR);
        }
        return "";
    }

    public void guardarCertificado() {
        if (intPagante == 1) {
            pagante = solicitante;
        } else {
            pagante = solicitado;
        }
        docGenDelegado.guardarCertificado(getDocGenerado());
        certificado.setCodCertificado(getDocGenerado().getDocCodigo());
        certificado.setDocumentoGenerado(getDocGenerado());
        certificado.setChaEstado(EnumEstadoCert.Generado);
        certificado.setChaNumero(new Long(getDocGenerado().getDocNumero()));
        certificado.setChaFechemision(new Date());
        certificado.setChaFechvigencia(solicitado.getColegiado().getColfechaHabilidad());
        certDelegado.create(certificado);
        docIncluido = new DocumentoIncluido();
        docIncluido.setDicObservacion("");
        docIncluido.setFkExpCodigo(expediente);
        docIncluido.setFkOpeCodigo(operacion);
        docIncluido.setFkDocCodigo(getDocGenerado());
        docIncluido.setDicLectura(false);
        docIncDelegado.create(docIncluido);
        operacion.setDocumentoIncluidoCollection(new ArrayList<DocumentoIncluido>());
        operacion.getDocumentoIncluidoCollection().add(docIncluido);
        transaccion.setOperacionActiva(operacion);
        if (cuentaIngresoTra != null) {
            if (cuentaIngresoTra.size() < 1) {
            } else {
                List<CuentaIngreso> cuentasIngreso;
                cuentasIngreso = new ArrayList<CuentaIngreso>();
                Double monto;
                if (certificado.getChaCostoobra() == null) {
                    monto = null;
                } else {
                    monto = certificado.getChaCostoobra().doubleValue();
                }
                Double mont = 0.0;
                for (CuentaingresoTramite cui : cuentaIngresoTra) {
                    if (cert < 3) {
                        cuentasIngreso.add(cui.getFkCinCodigo());
                    } else {
                        monto = monto * certificado.getFkTmoCodigo().getCambioActual();
                        ValorCuenta valor = valorCuentaDelegado.valorCuentaActual(cui.getFkCinCodigo().getCinCodigo());
                        if (valor.getVcuMontoObraMax() == null) {
                            if (monto.compareTo(valor.getVcuMontoObraMin()) >= 0) {
                                cuentasIngreso.add(cui.getFkCinCodigo());
                            }
                        } else if (monto.compareTo(valor.getVcuMontoObraMin()) >= 0 && (monto.compareTo(valor.getVcuMontoObraMax()) <= 0)) {
                            cuentasIngreso.add(cui.getFkCinCodigo());
                        }
                    }
                }
                docPago = movCuentaDelegado.crearDeudaTramite(cuentasIngreso, pagante, new Date(), transaccion, tipoDocumento, monto, tipoMoneda);
            }
        }
        persJuridica = new PersonaJuridica();
        propietario = new PersonaNatural();
        errorSolicitante = true;
        imprimeDoc = true;
        imprime = true;
        limpiarPagos();
        limpìarCert();
    }

    public void guardarCertificadoPagado() {
        if (intPagante == 1) {
            pagante = solicitante;
        } else {
            pagante = solicitado;
        }
        docGenDelegado.guardarCertificado(getDocGenerado());
        certificado.setCodCertificado(getDocGenerado().getDocCodigo());
        certificado.setDocumentoGenerado(getDocGenerado());
        certificado.setChaEstado(EnumEstadoCert.Pagado);
        certificado.setChaNumero(new Long(getDocGenerado().getDocNumero()));
        certificado.setChaFechemision(new Date());
        certificado.setChaFechvigencia(solicitado.getColegiado().getColfechaHabilidad());
        certDelegado.create(certificado);
        docIncluido = new DocumentoIncluido();
        docIncluido.setDicObservacion("");
        docIncluido.setFkExpCodigo(expediente);
        docIncluido.setFkOpeCodigo(operacion);
        docIncluido.setFkDocCodigo(getDocGenerado());
        docIncluido.setDicLectura(false);
        docIncDelegado.create(docIncluido);
        operacion.setDocumentoIncluidoCollection(new ArrayList<DocumentoIncluido>());
        operacion.getDocumentoIncluidoCollection().add(docIncluido);
        transaccion.setOperacionActiva(operacion);
        if (cuentaIngresoTra != null) {
            if (cuentaIngresoTra.size() < 1) {
            } else {
                List<CuentaIngreso> cuentasIngreso;
                cuentasIngreso = new ArrayList<CuentaIngreso>();
                Double monto;
                if (certificado.getChaCostoobra() == null) {
                    monto = null;
                } else {
                    monto = certificado.getChaCostoobra().doubleValue();
                }
                Double mont = 0.0;
                for (CuentaingresoTramite cui : cuentaIngresoTra) {
                    if (cert < 3) {
                        cuentasIngreso.add(cui.getFkCinCodigo());
                    } else {
                        monto = monto * certificado.getFkTmoCodigo().getCambioActual();
                        ValorCuenta valor = valorCuentaDelegado.valorCuentaActual(cui.getFkCinCodigo().getCinCodigo());
                        if (valor.getVcuMontoObraMax() == null) {
                            if (monto.compareTo(valor.getVcuMontoObraMin()) >= 0) {
                                cuentasIngreso.add(cui.getFkCinCodigo());
                            }
                        } else if (monto.compareTo(valor.getVcuMontoObraMin()) >= 0 && (monto.compareTo(valor.getVcuMontoObraMax()) <= 0)) {
                            cuentasIngreso.add(cui.getFkCinCodigo());
                        }
                    }
                }
                docPago = movCuentaDelegado.PagarTramite(cuentasIngreso, pagante, new Date(), transaccion, tipoDocumento, monto, tipoMoneda);
            }
        }
        persJuridica = new PersonaJuridica();
        propietario = new PersonaNatural();
        errorSolicitante = true;
        imprimeDoc = true;
    }
    private Double porcentaje;
    private String costo;

    public String calcularMonto2() {
        habPago();
        if (calcularMonto().isEmpty()) {
            mostrarMensaje("Costo : ", "Debe ingresar un monto de obra correcto", FacesMessage.SEVERITY_ERROR);
        }
        return "";
    }

    public String calcularMonto() {
        Double mont = 0.0;
        Double monto;
        for (CuentaingresoTramite cit : cuentaIngresoTra) {
            Igv igvUsar = igvFacadeLocal.igvVigente();
            Double valorIgvDecimal = 0.0;
            if (igvUsar != null) {
                valorIgvDecimal = igvUsar.getIgvValor() / 100;
            } else {
                ControladorAbstracto.warn("No existe Valor de IGV ingresado y habilitado.Registrelo primero.");
                montoPagar = "";
            }
            try {
                monto = Double.parseDouble(costo.replace(" ", ""));
            } catch (Exception e) {
                montoPagar = "";
                return "";
            }
            monto = monto * certificado.getFkTmoCodigo().getCambioActual();
            ValorCuenta v = valorCuentaDelegado.valorCuentaActual(cit.getFkCinCodigo().getCinCodigo());
            if (v.getVcuMontoObraMax() == null) {
                if (monto.compareTo(v.getVcuMontoObraMin()) >= 0) {
                    if (tipoDocumento.getTdoDesc().toUpperCase().equals("RECIBO")) {
                        mont = v.getVcuValor() / (1 + valorIgvDecimal);
                    } else {
                        mont = v.getVcuValor();
                    }
                }
            } else if (monto.compareTo(v.getVcuMontoObraMin()) >= 0 && (monto.compareTo(v.getVcuMontoObraMax()) <= 0)) {
                if (tipoDocumento.getTdoDesc().toUpperCase().equals("RECIBO")) {
                    mont = v.getVcuValor() / (1 + valorIgvDecimal);
                } else {
                    mont = v.getVcuValor();
                }
            }
        }
        String patron = ("###,###,###.##");
        DecimalFormat myFormatter = new DecimalFormat(patron);
        montoPagar = myFormatter.format(mont);
        montoPagar = "S/. " + montoPagar;
        return "#";
    }

    private void limpiarPagos() {
        docPago = new DocumentoPago();
        realizarPagoFacade = new RealizarPagoDelegate();
    }

    public String pdfDocPago() {
        if (intPagante == 1) {
            if (delegadoDireccion.buscaDireccionColegiado(solicitante.getSolCodigo()) == null) {
                mostrarMensaje("", "El solicitante no cuenta con direccion para generar su documento de pago", null);
                return "";
            }
        } else if (delegadoDireccion.buscaDireccionColegiado(solicitado.getSolCodigo()) == null) {
            mostrarMensaje("", "El solicitante no cuenta con direccion para generar su documento de pago", null);
            return "";
        }

        if (cert == 1) {
            grabarTraCert();
            getDocGenerado().setFkTdoCodigo(tipoDocDelegado.buscarXNombre("Certificado de Habilidad Profesional"));
        } else if (cert == 2) {
            if (certificado.getCodDistrito() != null) {
//                    if (creoPersona) {
//                        try {
//                            if (tipoPersona == 0) {
//                                personaDelegado.create(propietario);
//                                certificado.setCodPropietario(propietario);
//                            } else {
//                                perJurDelegado.create(persJuridica);
//                                certificado.setCodPropietario(persJuridica);
//                            }
//                        } catch (Exception e) {
//                            mostrarMensaje("Propietario : ", "Ocurrio un error al registar al propietario, verifique que el propietario no este ya registrado", FacesMessage.SEVERITY_ERROR);
//                            return "";
//                        }
//                    }
//                    if (certificado.getCodPropietario() == null) {
//                        mostrarMensaje("Propietario : ", "No ha seleccionado un propietario", FacesMessage.SEVERITY_ERROR);
//                        return "";
//                    } else if (certificado.getCodPropietario().getSolCodigo() == null) {
//                        mostrarMensaje("Propietario : ", "No ha seleccionado un propietario", FacesMessage.SEVERITY_ERROR);
//                        return "";
//                    }
                grabarTraCert();
                getDocGenerado().setFkTdoCodigo(tipoDocDelegado.buscarXNombre("Certificado de Habilidad de Expediente de Construcción"));
            } else {
                mostrarMensaje("Direccion : ", "Debe seleccionar un distrito", FacesMessage.SEVERITY_ERROR);
            }
        } else {
            if (certificado.getCodDistrito() != null) {
                Double monto;
                try {
                    certificado.setChaCostoobra(new BigDecimal(costo.replace(" ", "")));
                } catch (Exception e) {
                    mostrarMensaje("Costo : ", "Debe ingresar un monto de obra correcto", FacesMessage.SEVERITY_ERROR);
                    return "";
                }
                if (certificado.getChaCostoobra() == null) {
                    mostrarMensaje("Costo : ", "Debe ingresar un monto de obra correcto", FacesMessage.SEVERITY_ERROR);
                    return "";
                } else {
                    try {
                        monto = certificado.getChaCostoobra().doubleValue();
                    } catch (Exception e) {
                        mostrarMensaje("Costo : ", "Debe ingresar un monto de obra correcto", FacesMessage.SEVERITY_ERROR);
                        return "";
                    }
                }
//                    if (creoPersona) {
//                        try {
//                            perJurDelegado.create(persJuridica);
//                            certificado.setCodPropietario(persJuridica);
//                        } catch (Exception e) {
//                            mostrarMensaje("Propietario : ", "Ocurrio un error al registar al propietario, verifique que el propietario no este ya registrado", FacesMessage.SEVERITY_ERROR);
//                        }
//                    }
//                    if (certificado.getCodPropietario() == null) {
//                        mostrarMensaje("Propietario : ", "No ha seleccionado un propietario", FacesMessage.SEVERITY_ERROR);
//                        return "";
//                    } else if (certificado.getCodPropietario().getSolCodigo() == null) {
//                        mostrarMensaje("Propietario : ", "No ha seleccionado un propietario", FacesMessage.SEVERITY_ERROR);
//                        return "";
//                    }
                grabarTraCert();
                getDocGenerado().setFkTdoCodigo(tipoDocDelegado.buscarXNombre("Certificado Habilidad Firma de Contrato de Obras Publicas"));
            } else {
                mostrarMensaje("Direccion : ", "Debe seleccionar un distrito", FacesMessage.SEVERITY_ERROR);
            }
        }
        getDocGenerado().setArea(areaDelegado.buscar("Tramite Documentario"));
        guardarCertificadoPagado();

        if (docPago != null) {
            realizarPagoFacade.reporteCert(docPago);
            limpiarPagos();
        }
        return "";
    }

    public void grabarTraCert() {
        if (creoSol) {
            creoSol = false;
            if (tipoPersonaSol == 0) {
                personaDelegado.create(solicitantePer);
                solicitante = solicitantePer;
                direccionNueva.setSolCodigo(solicitantePer);
            } else {
                perJurDelegado.create(solicitanteEmp);
                solicitante = solicitanteEmp;
                direccionNueva.setSolCodigo(solicitanteEmp);
            }
            delegadoDireccion.create(direccionNueva);
        }
        if (solicitado.getColegiado().getTipoColegiado().getTcoNombre().equals("Externo")) {
            colegiadoDelegado.edit(solicitado.getColegiado());
        }
        docRequeridos = new ArrayList<DocRequerido>();
        tramiteCip = true;
        grabar();
        transaccion.setOperacionActiva(operacion);
        operacionDelegado.Aprobar(transaccion);
        docGenDelegado = new DocumentoGeneradoDelegate();
        setDocGenerado(new DocumentoGenerado());
        Cookie[] cookies = ControladorAbstracto.getRequest().getCookies();
        String codUsuario = Utiles.getCookieValue(cookies, "Usuario", "nulo");
        if (!codUsuario.equals("nulo")) {
            empleado = emplDelegado.find(new Long(codUsuario));
        }
        getDocGenerado().setFkSolCodigo(solicitado);
        getDocGenerado().setFkPerCodigoemp(empleado);
        getDocGenerado().setDocGlosa(transaccion.getTraCodigo().toString());
    }

    public String grabar() {
        try {
            if (solicitado != null) {
                for (DocRequerido doc : docRequeridos) {
                    if (!doc.isEstado()) {
                        mostrarMensaje("", "Tiene que subir todos los archivos obligatorios", FacesMessage.SEVERITY_ERROR);
                        return "";
                    }
                }
                if (!tramiteCip) {
                    for (CuentaingresoTramite cit : cuentaIngresoTra) {
                        if (!cit.getCitOpcional()) {
                            mostrarMensaje("", "Tiene que elegir todos los pagos obligatorios", FacesMessage.SEVERITY_ERROR);
                            return "";
                        }
                    }
                }

                if (destino == 1) {
                    setTransaccion(new Transaccion(null, new Date(), false, receptor));
                } else {
                    setTransaccion(new Transaccion(null, new Date(), false, destino));
                }
                expediente = new Expediente(null, new Date(), 2);
                transaccion.setFkSolCodigo(solicitante);
                transaccion.setFkSolicitado(solicitado);
                transaccion.setFkTrmCodigo(tramite);
                grabarTransaccion();
                if (destino == 1) {
                    if (receptor == 1) {
                        solRecepDelegado.create(new SolRecep(transaccion.getTraCodigo(), receptorPer));
                    }
                } else if (destino == 2) {
                    dirRecepDelegado.create(new DirRecep(transaccion, direccionSeleccionada));
                } else if (destino == 3) {
                    direccionNueva.setSolCodigo(solicitante);
                    delegadoDireccion.create(direccionNueva);
                    dirRecepDelegado.create(new DirRecep(transaccion, direccionNueva));
                } else if (destino == 4) {
                }
                mostrarMensaje("Bien", "Solicitud Enviada con el Nro " + transaccion.getTraCodigo().toString(), FacesMessage.SEVERITY_INFO);
            } else {
                mostrarMensaje("", "Seleccionar Solicitado", FacesMessage.SEVERITY_ERROR);
                return "";
            }
        } catch (Exception e) {
            mostrarMensaje(e.toString() + ": ", e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return "";
    }

    public String limpìarCert() {
        setDocGenerado(new DocumentoGenerado());
        solicitante = new Solicitante();
        solicitado = new PersonaNatural();
        solicitado.setColegiado(new Colegiado());
        certificado = new Certificado();
        tipoDocumento = new TipoDocumento();
        docPago = new DocumentoPago();
        realizarPagoFacade = new RealizarPagoDelegate();
        creoPersona = false;
        tipoPersona = 0;
        activarHabilidad = false;
        dniProp = "";
        dniSolicitante = "";
        cipSolicitante = "";
        errorSol = "";
        imprime = true;
        imprimeDoc = true;
        errorSolicitante = true;
        preformateado = true;
        direccionNueva = new DireccionPersona();
        costo = "";
        montoPagar = "";
        return "";
    }
    private boolean imprime;
    private boolean imprimeDoc;
    private int cert;

    public String imprimirCert() {
        if (cert == 1) {
            jasper = new JasperController();
            certificado.setDocumentoGenerado(getDocGenerado());
            if (jasper.exportarCertHabil(certificado, preformateado).equals("true")) {
                certificado.setChaEstado(EnumEstadoCert.Entregado);
                certDelegado.edit(certificado);
            }
        } else if (cert == 2) {
            jasper = new JasperController();
            certificado.setDocumentoGenerado(getDocGenerado());
            if (jasper.exportarCertConst(certificado, preformateado).equals("true")) {
                certificado.setChaEstado(EnumEstadoCert.Entregado);
                certDelegado.edit(certificado);
            }
        } else {
            jasper = new JasperController();
            certificado.setDocumentoGenerado(getDocGenerado());
            if (jasper.exportarCertObras(certificado, preformateado).equals("true")) {
                certificado.setChaEstado(EnumEstadoCert.Entregado);
                certDelegado.edit(certificado);
            }
        }
        limpìarCert();
        return "";
    }

    public String imprimirDocPago() {
        errorSolicitante = true;
        imprimeDoc = true;
        imprime = false;
        return "#";
    }

    public String imprimir() {
        imprime = true;
        return "";
    }

    public String getCip() {
        return cip;
    }

    public void setCip(String cip) {
        if (cip.length() == 1) {
            cip = "00000" + cip;
        }
        if (cip.length() == 2) {
            cip = "0000" + cip;
        }
        if (cip.length() == 3) {
            cip = "000" + cip;
        }
        if (cip.length() == 4) {
            cip = "00" + cip;
        }
        if (cip.length() == 5) {
            cip = "0" + cip;
        }
        this.cip = cip;
    }
    //archivos
    private UploadedFile upFile;
    private UploadedFile upFile2;

    public UploadedFile getUpFile2() {
        return upFile2;
    }

    public void setUpFile2(UploadedFile upFile2) {
        if (upFile2 != null) {
            this.upFile2 = upFile2;
        }
    }

    public UploadedFile getUpFile() {
        return upFile;
    }

    public void setUpFile(UploadedFile upFile) {
        if (upFile != null) {
            this.upFile = upFile;
        }
    }

    public boolean validar(String voucher) {
        if (voucher == null || voucher.length() == 0) {
            mostrarMensaje("Error", "Debe ingresar el numero del voucher que esta subiendo", FacesMessage.SEVERITY_ERROR);
            return false;
        } else {
            if (documentoExtDelegado.buscarPorSerie(voucher) != null) {
                mostrarMensaje("Error", "El numero de Voucher Ingresado ya existe", FacesMessage.SEVERITY_ERROR);
                return false;
            }
        }
        return true;
    }
    private int codigo = 0;

    public String upload1() {
        if (upFile != null) {
            if (docRequeridoSeleccionado.getFkTdoCodigo().getTdoDesc().equals("Voucher")) {
                if (validar(docRequeridoSeleccionado.getGlosa())) {
                    docRequeridoSeleccionado.setEstado(true);
                    docRequeridoCargado = new DocRequerido(docRequeridoSeleccionado.getDreCodigo(), docRequeridoSeleccionado.getFkTdoCodigo(), upFile, docRequeridoSeleccionado.getGlosa(), ++codigo);
                    modalCI = true;
                }
            } else {
                docRequeridoSeleccionado.setEstado(true);
                DocRequerido document = new DocRequerido(docRequeridoSeleccionado.getDreCodigo(), docRequeridoSeleccionado.getFkTdoCodigo(), upFile, docRequeridoSeleccionado.getGlosa(), ++codigo);
                docCargados.add(document);
            }
        }
        return "";
    }

    public String upload() throws IOException {
        try {
            if (!voucher1Activo) {
                voucherCache = getVoucherSeleccionado();
                if (upFile != null) {
                    if (voucherSeleccionado == null) {
                        mostrarMensaje("Error", "Debe elegir un Concepto", FacesMessage.SEVERITY_ERROR);
                    } else if (validar(voucher)) {
                        if (voucher.equals(voucher2)) {
                            mostrarMensaje("Error", "El numero ingresado es igual al del Voucher Nro 2", FacesMessage.SEVERITY_ERROR);
                        } else {
                            nomImagen1 = upFile.getName();
                            voucher1Activo = true;
                            comboActivo = true;
                            if (getVoucherSeleccionado().name().equals("Tramite_Envio")) {
                                voucher2Visible = true;
                                verNumVoucher1 = true;
                            } else {
                                voucher2Visible = false;
                                verNumVoucher1 = false;
                            }
                        }
                    }
                } else {
                    mostrarMensaje("Error", "Debe subir un archivo", FacesMessage.SEVERITY_ERROR);
                }
            } else if (!voucher2Activo) {
                if (upFile2 != null) {
                    if (validar(voucher2)) {
                        if (voucher2.equals(voucher)) {
                            mostrarMensaje("Error", "El numero ingresado es igual al del Voucher Nro 1", FacesMessage.SEVERITY_ERROR);
                        } else {
                            nomImagen2 = upFile2.getName();
                            voucher2Activo = true;
                            voucher2Visible = true;
                        }
                    }
                } else {
                    mostrarMensaje("Error", "Debe subir un archivo", FacesMessage.SEVERITY_ERROR);
                }
            } else {
                modal = true;
            }
            return "si";
        } catch (Exception ioe) {
            System.out.println("File Upload Unsuccessful.");
            System.out.println("errorrrr" + ioe.toString());
            return "no";
        }
    }

    public String verObservacion() {
        modalObserv = true;
        return "#";
    }

    public String verImagen() {
        modal = true;
        return "#";
    }

    public String pagar() {
        try {
            Integer band = 0;
            movimientoCuenta.setEstado(EnumEstadoMovimiento.Pagada);
            movCuentaDelegado.edit(movimientoCuenta);

            for (MovimientoCuenta mov : movimientoCuentas) {
                if (mov.getEstado().equals(EnumEstadoMovimiento.Impaga)) {
                    band = 1;
                }
            }
            mostrarMensaje("bien", "Monto Pagado", FacesMessage.SEVERITY_INFO);
            if (band == 0) {
                operAprob = true;
            }
            return "#";
        } catch (Exception e) {
            mostrarMensaje("Mal", "Error al Pagar: " + e.toString(), FacesMessage.SEVERITY_ERROR);
            return "#";
        }
    }

    public String aprobProc() {
        operacionDelegado.Aprobar(transaccion);
        mostrarMensaje("bien", "Tramite Derivado", FacesMessage.SEVERITY_INFO);
        return "buscar";
    }

    public String aprobar() {
        try {
            Integer band = 0;
            docIncluido.setDicEstado(new Short("1"));
            docIncDelegado.edit(docIncluido);
            for (DocumentoIncluido doc : documentosRecibidos) {
                if (doc.getDicEstado() == 0 || doc.getDicEstado() == 2) {
                    band = 1;
                }
            }
            mostrarMensaje("bien", "Se aprobo el Archivo", FacesMessage.SEVERITY_INFO);
            if (band == 0) {
                operAprob = true;
            }
            return "";
        } catch (Exception e) {
            mostrarMensaje("Mal", "Error al Aprobar el Documento: " + e.toString(), FacesMessage.SEVERITY_ERROR);
            return "";
        }
    }

    public String modalU() {
        modalU = true;
        return "#";
    }

    public String modalRadio() {
        if (destino == 3) {
            modal = true;
        }
        return "#";
    }

    public String eliminarArchivo() {
        int cant = docCargados.size();
        int i;
        for (i = 0; i < cant; i++) {
            if (docCargados.get(i).getCodigo() == docRequeridoSeleccionado.getCodigo()) {
                break;
            }
        }
        docCargados.remove(i);
        return "";
    }

    public String eliminarImg1() {
        nomImagen1 = "";
        voucher = "";
        voucher1Activo = false;
        verNumVoucher1 = true;
        upFile = null;
        if (!voucher2Activo) {
            comboActivo = false;
        }
        return "";
    }

    public String eliminarImg2() {
        nomImagen2 = "";
        voucher2 = "";
        voucher2Activo = false;
        voucher2Visible = false;
        if (!voucher1Activo) {
            comboActivo = false;
        }

        upFile2 = null;
        return "";
    }

    public String aceptarObserv() {
        modalObserv = false;
        return "#";
    }

    public String aceptarModalU() {
        modalU = false;
        return "";
    }

    public String aceptarModal() {
        modal = false;
        return "";
    }

    public String irPagar() {
        try {
            ControladorAbstracto.getResponse().sendRedirect("/tesoreria/faces/DocumentoPago/nuevo.jsp");
        } catch (IOException ex) {
            Logger.getLogger(TramitesController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "";
    }

    public SelectItem[] getPagosVoucherItems(List<CuentaingresoTramite> la) {
        try {
            SelectItem[] select = new SelectItem[la.size()];
            int i = 0;
            for (CuentaingresoTramite ev : la) {
                SelectItem item = new SelectItem(ev, ev.getFkCinCodigo().getCinDesc());
                select[i++] = item;
            }
            return select;
        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            select[0] = new SelectItem(null, "No Ingreso Cuentas de Ingreso");
            return select;
        }
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    public String irDireccion() {
        return "nuevaD";
    }

    public String getVoucher() {
        return voucher;
    }

    public void setVoucher(String voucher) {
        this.voucher = voucher;
    }

    public List<Transaccion> getListaTransacciones() {
        return listaTransacciones;
    }

    public void setListaTransacciones(List<Transaccion> listaTransacciones) {
        this.listaTransacciones = listaTransacciones;
    }

    public Transaccion getTransaccion() {
        return transaccion;
    }

    public void setTransaccion(Transaccion transaccion) {
        this.transaccion = transaccion;
    }

    public Operacion getOperacion() {

        return operacion;
    }

    public void setOperacion(Operacion operacion) {
        this.operacion = operacion;
    }

    public boolean isModal() {
        return modal;
    }

    public void setModal(boolean modal) {
        this.modal = modal;
    }

    public String getVoucher2() {
        return voucher2;
    }

    public void setVoucher2(String voucher2) {
        this.voucher2 = voucher2;
    }

    public boolean isVoucher1Activo() {
        return voucher1Activo;
    }

    public void setVoucher1Activo(boolean voucherActivo) {
        this.voucher1Activo = voucherActivo;
    }

    public boolean isVoucher2Activo() {
        return voucher2Activo;
    }

    public void setVoucher2Activo(boolean voucher2Activo) {
        this.voucher2Activo = voucher2Activo;
    }

    public String getNomImagen1() {
        return nomImagen1;
    }

    public void setNomImagen1(String nomImagen1) {
        this.nomImagen1 = nomImagen1;
    }

    public String getNomImagen2() {
        return nomImagen2;
    }

    public void setNomImagen2(String nomImagen2) {
        this.nomImagen2 = nomImagen2;
    }

    public String getRuta() {
        return ruta;
    }

    public void setRuta(String ruta) {
        this.ruta = ruta;
    }

    public String getRutaImagen() {
        return rutaImagen;
    }

    public void setRutaImagen(String rutaImagen) {
        this.rutaImagen = rutaImagen;
    }

    public DocumentoExterno getDocumentoExterno() {
        return documentoExterno;
    }

    public void setDocumentoExterno(DocumentoExterno documentoExterno) {
        this.documentoExterno = documentoExterno;
    }

    public EnumVoucher getVoucherSeleccionado() {
        return voucherSeleccionado;
    }

    public void setVoucherSeleccionado(EnumVoucher voucherSeleccionado) {
        this.voucherSeleccionado = voucherSeleccionado;
    }

    public boolean isVoucher2Visible() {
        return voucher2Visible;
    }

    public void setVoucher2Visible(boolean voucher2Visible) {
        this.voucher2Visible = voucher2Visible;
    }

    public boolean isComboActivo() {
        return comboActivo;
    }

    public void setComboActivo(boolean comboActivo) {
        this.comboActivo = comboActivo;
    }

    public boolean isVerNumVoucher1() {
        return verNumVoucher1;
    }

    public void setVerNumVoucher1(boolean verNumVoucher1) {
        this.verNumVoucher1 = verNumVoucher1;
    }

    public DireccionPersona getDireccionPersona() {
        return direccionNueva;
    }

    public void setDireccionPersona(DireccionPersona direccionNueva) {
        this.direccionNueva = direccionNueva;
    }

    public PersonaNatural getSolicitado() {
        return solicitado;
    }

    public void setSolicitado(PersonaNatural solicitado) {
        this.solicitado = solicitado;
    }

    public int getIntSolicitado() {
        return intSolicitado;
    }

    public void setIntSolicitado(int intSolicitado) {
        this.intSolicitado = intSolicitado;
    }

    public String getCipSolicitante() {
        return cipSolicitante;
    }

    public void setCipSolicitante(String cip) {
        if (cip.length() == 1) {
            cip = "00000" + cip;
        }
        if (cip.length() == 2) {
            cip = "0000" + cip;
        }
        if (cip.length() == 3) {
            cip = "000" + cip;
        }
        if (cip.length() == 4) {
            cip = "00" + cip;
        }
        if (cip.length() == 5) {
            cip = "0" + cip;
        }
        this.cipSolicitante = cip;
    }

    public Solicitante getSolicitante() {
        return solicitante;
    }

    public void setSolicitante(Solicitante solicitante) {
        this.solicitante = solicitante;
    }

    public List<DocumentoImagen> getDocImagenes() {
        return docImagenes;
    }

    public void setDocImagenes(List<DocumentoImagen> docImagenes) {
        this.docImagenes = docImagenes;
    }

    public DocumentoImagen getDocImagen() {
        return DocImagen;
    }

    public void setDocImagen(DocumentoImagen DocImagen) {
        this.DocImagen = DocImagen;
    }

    public String buscarTransacion() {
        listarTransacciones();
        try {
            ControladorAbstracto.getResponse().sendRedirect("/tramite/faces/solicitudWeb/buscar.jsp");
        } catch (IOException ex) {
            Logger.getLogger(TramitesController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "buscar";
    }

    public DireccionPersona getDireccionSeleccionada() {
        return direccionSeleccionada;
    }

    public void setDireccionSeleccionada(DireccionPersona direccionSeleccionada) {
        this.direccionSeleccionada = direccionSeleccionada;
    }

    public Tramite getTramite() {
        return tramite;
    }

    public void setTramite(Tramite tramite) {
        this.tramite = tramite;
        if (tramite.getTrmNombre().equals(certHabil)) {
            cert = 1;
        } else if (tramite.getTrmNombre().equals(certConstruc)) {
            cert = 2;
        } else {
            cert = 3;
        }
    }

    private void listarTramites() {
        tramites = delegadoTramite.listarXTipo(EnumTipoTramite.Solicitud);
        for (Tramite trm : tramites) {
            for (CuentaingresoTramite ciTrm : trm.getCuentaingresoTramiteCollection()) {
                ciTrm.setValorCuenta(valorCuentaDelegado.valorCuentaActual(ciTrm.getFkCinCodigo().getCinCodigo()));
            }
        }
    }

    public String getcargar() {
        listarTramites();
        return "";
    }

    public String irSolicitud() {
        errorSolicitante = false;
        fecha = Calendar.getInstance();
        fecha.set(Calendar.HOUR, 0);
        fecha.set(Calendar.MINUTE, 0);
        fecha.set(Calendar.SECOND, 0);

        if (solicitado != null) {
            if (solicitado.getColegiado() != null) {
                if (solicitado.getColegiado().getColfechaHabilidad() != null) {
                    if (solicitado.getColegiado().getColfechaHabilidad().compareTo(fecha.getTime()) == 1) {
                        setErrorSolicitante(true);
                        errorSol = "El Solicitado no se encuentra Habil";
                    }
                } else {
                    setErrorSolicitante(true);
                    errorSol = "El Solicitado no se encuentra Habil";
                }
            }
        }

        cuentaIngresoTra = tramite.getCuentaingresoTramiteCollection();
        tramiteCip = false;
        docCargados = new ArrayList<DocRequerido>();
        listarDocumentos();
        if (getCuentaIngresoTra() != null) {
            if (getCuentaIngresoTra().size() > 0) {
                docRequeridos.add(new DocRequerido(tipoDocDelegado.buscarXNombre("Voucher")));
            }
        }
        docRequ = !docRequeridos.isEmpty();
        return "solicitud";
    }

    public String irSolicitudCip() {
        errorSolicitante = false;

        fecha = Calendar.getInstance();
        fecha.setTime(new Date());
        fecha.set(Calendar.HOUR, 0);
        fecha.set(Calendar.MINUTE, 0);
        fecha.set(Calendar.SECOND, 0);
//        if (solicitado != null) {
//            if (solicitado.getColegiado() != null) {
//                if (solicitado.getColegiado().getColfechaHabilidad() != null) {
//                    if (solicitado.getColegiado().getColfechaHabilidad().compareTo(fecha.getTime()) == 1) {
//                        setErrorSolicitante(true);
//                        errorSol = "El Solicitado no se encuentra Habil";
//                    }
//                } else {
//                    setErrorSolicitante(true);
//                    errorSol = "El Solicitado no se encuentra Habil";
//                }
//            }
//        }
        cuentaIngresoTra = tramite.getCuentaingresoTramiteCollection();
        setCuentasIngresoOp(new ArrayList<CuentaingresoTramite>());
        for (CuentaingresoTramite cit : cuentaIngresoTra) {
            if (cit.getCitOpcional()) {
                getCuentasIngresoOp().add(cit);
            }
        }
        cuentIng = !cuentasIngresoOp.isEmpty();
        tramiteCip = true;
        docCargados = new ArrayList<DocRequerido>();
        listarDocumentos();
        docRequ = !docRequeridos.isEmpty();
        return "solicitudCip";
    }

    public List<Tramite> getTramites() {
        return tramites;
    }

    public void setTramites(List<Tramite> tramites) {
        this.tramites = tramites;
    }

    private void listarDocumentos() {
        setDocRequeridos(delegadoDocRequerido.listarDocumentoXTramite(tramite));
    }

    public List<DocRequerido> getDocRequeridos() {
        return docRequeridos;
    }

    public void setDocRequeridos(List<DocRequerido> docRequeridos) {
        this.docRequeridos = docRequeridos;
    }

    public SimpleSelection getDocRequeridoSelecionadas() {
        return docRequeridoSelecionadas;
    }

    public void setDocRequeridoSelecionadas(SimpleSelection docRequeridoSelecionadas) {
        this.docRequeridoSelecionadas = docRequeridoSelecionadas;
    }

    public DocRequerido getDocRequeridoSeleccionado() {
        return docRequeridoSeleccionado;
    }

    public void setDocRequeridoSeleccionado(DocRequerido docRequeridoSeleccionado) {
        this.docRequeridoSeleccionado = docRequeridoSeleccionado;
    }

    public List<DocRequerido> getDocCargados() {
        return docCargados;
    }

    public void setDocCargados(List<DocRequerido> docCargados) {
        this.docCargados = docCargados;
    }

    public int getTipoDoc() {
        return tipoDoc;
    }

    public void setTipoDoc(int tipoDoc) {
        this.tipoDoc = tipoDoc;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public boolean isModalPer() {
        return modalPer;
    }

    public void setModalPer(boolean modalPer) {
        this.modalPer = modalPer;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    public String getDniSolicitante() {
        return dniSolicitante;
    }

    public void setDniSolicitante(String dniSolicitante) {
        this.dniSolicitante = dniSolicitante;
    }

    public PersonaNatural getReceptorPer() {
        return receptorPer;
    }

    public void setReceptorPer(PersonaNatural receptorPer) {
        this.receptorPer = receptorPer;
    }

    public String getDniReceptor() {
        return dniReceptor;
    }

    public void setDniReceptor(String dniReceptor) {
        this.dniReceptor = dniReceptor;
    }

    public boolean isModalRecp() {
        return modalRecp;
    }

    public void setModalRecp(boolean modalRecp) {
        this.modalRecp = modalRecp;
    }

    public Empleado getEmpleado() {
        return empleado;
    }

    public void setEmpleado(Empleado empleado) {
        this.empleado = empleado;
    }

    public List<DocumentoIncluido> getDocumentosRecibidos() {
        return documentosRecibidos;
    }

    public void setDocumentosRecibidos(List<DocumentoIncluido> documentosRecibidos) {
        this.documentosRecibidos = documentosRecibidos;
    }

    public void drawImage(OutputStream output, Object object) throws IOException {
        try {
            Integer indexDocumentoRequerido = new Integer(object.toString());
            docIncluido = documentosRecibidos.get(indexDocumentoRequerido);
            if (docIncluido != null) {
                mostrarMensaje("", "encontro docInc", FacesMessage.SEVERITY_INFO);
                mostrarMensaje("", docIncluido.getFkDocCodigo().getDocumentoImagen().getDimRuta(), FacesMessage.SEVERITY_INFO);

                File file = new File(docIncluido.getFkDocCodigo().getDocumentoImagen().getDimRuta());
                mostrarMensaje("", file.getAbsolutePath(), FacesMessage.SEVERITY_INFO);
                mostrarMensaje("", file.getName(), FacesMessage.SEVERITY_INFO);
                FileInputStream inputStream = new FileInputStream(file);
                int tamanoInput = inputStream.available();
                byte[] datosPDF = new byte[tamanoInput];
                inputStream.read(datosPDF, 0, tamanoInput);
                output.write(datosPDF, 0, tamanoInput);
            }
        } catch (Exception e) {
            mostrarMensaje(e.toString(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
    }

    public void drawImage2(OutputStream output, Object object) throws IOException {
        try {
            File file = new File(rutaImagen);
            FileInputStream inputStream = new FileInputStream(file);
            int tamanoInput = inputStream.available();
            byte[] datosPDF = new byte[tamanoInput];
            inputStream.read(datosPDF, 0, tamanoInput);
            output.write(datosPDF, 0, tamanoInput);
        } catch (Exception e) {
            mostrarMensaje(e.toString(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
    }

    public String mostrarDoc() {
        try {
            File file = new File(DocImagen.getDimRuta().toString());
            FacesContext fcontext = FacesContext.getCurrentInstance();
            ExternalContext eContext = fcontext.getExternalContext();
            HttpServletResponse response = (HttpServletResponse) eContext.getResponse();
            response.setHeader("Content-Disposition", "inline; filename=" + file.getName());
            response.setHeader("Cache-Control", "public");
            response.setContentType("application/" + DocImagen.getAplication());
            OutputStream os = response.getOutputStream();
            FileInputStream inputStream = new FileInputStream(file);
            int tamanoInput = inputStream.available();
            byte[] datosPDF = new byte[tamanoInput];
            inputStream.read(datosPDF, 0, tamanoInput);
            os.write(datosPDF, 0, tamanoInput);
            os.close();
            fcontext.responseComplete();
        } catch (Exception e) {
            return "";
        }
        return "";
    }

    public void drawImagenFirma(OutputStream output, Object object) throws IOException {

        try {
            File file = new File(colFirma.getCimRuta());
            FileInputStream inputStream = new FileInputStream(file);
            int tamañoInput = inputStream.available();
            byte[] datos = new byte[tamañoInput];
            inputStream.read(datos, 0, tamañoInput);
            output.write(datos, 0, tamañoInput);

        } catch (Exception e) {
        }
    }

    public void drawImagenFoto(OutputStream output, Object object) throws IOException {
        try {
            File file = new File(colFoto.getCimRuta());
            FileInputStream inputStream = new FileInputStream(file);
            int tamañoInput = inputStream.available();
            byte[] datos = new byte[tamañoInput];
            inputStream.read(datos, 0, tamañoInput);
            output.write(datos, 0, tamañoInput);
        } catch (Exception e) {
        }
    }

    public void drawImagenSellos(OutputStream output, Object object) throws IOException {

        ColegiadoImagen Sello = new ColegiadoImagen();

        try {
            Integer index = new Integer(object.toString());
            Sello = listaSellos.get(index);
            File file = new File(Sello.getCimRuta());
            FileInputStream inputStream = new FileInputStream(file);
            int tamañoInput = inputStream.available();
            byte[] datos = new byte[tamañoInput];
            inputStream.read(datos, 0, tamañoInput);
            output.write(datos, 0, tamañoInput);

        } catch (Exception e) {
        }
    }
    private Departamento dpto;
    private ProvinciaDelegate ProvDelegado;

    public SelectItem[] getSelectListaItemProvincia() {

        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            List<Provincia> listaProvincia = ProvDelegado.ListaPorDpto(dpto);
            selects = new SelectItem[listaProvincia.size()];
            int cont = 0;
            for (Provincia prov : listaProvincia) {

                SelectItem item = new SelectItem(prov, prov.getProNombre());
                selects[cont] = item;
                cont++;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error");
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen provincias");
            selects[0] = item;
            return selects;
        }

    }
    private Provincia provincia;
    private DistritoDelegate delegado;

    public SelectItem[] getSelectListaItemDistrito() {
        try {
            SelectItem[] selects = null;
            List<Distrito> listaDistrito = delegado.listaPorProvincia(provincia);
            selects = new SelectItem[listaDistrito.size()];
            int cont = 0;
            for (Distrito dist : listaDistrito) {

                SelectItem item = new SelectItem(dist, dist.getDisNombre());
                selects[cont] = item;
                cont++;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error");
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen distritos");
            selects[0] = item;
            return selects;
        }
    }

    public Departamento getDpto() {
        return dpto;
    }

    public void setDpto(Departamento dpto) {
        this.dpto = dpto;
    }

    public Provincia getProvincia() {
        return provincia;
    }

    public void setProvincia(Provincia provincia) {
        this.provincia = provincia;
    }

    public CuentaingresoTramite getCuentIngTram() {
        return cuentIngTram;
    }

    public void setCuentIngTram(CuentaingresoTramite cuentIngTram) {
        this.cuentIngTram = cuentIngTram;
    }

    public DocumentoIncluido getDocIncluido() {
        return docIncluido;
    }

    public void setDocIncluido(DocumentoIncluido docIncluido) {
        this.docIncluido = docIncluido;
    }

    public List<CuentaingresoTramite> getCuentaIngresoTra() {
        return cuentaIngresoTra;
    }

    public void setCuentaIngresoTra(List<CuentaingresoTramite> cuentaIngresoTra) {
        this.cuentaIngresoTra = cuentaIngresoTra;
    }

    public boolean isModalObserv() {
        return modalObserv;
    }

    public void setModalObserv(boolean modalObserv) {
        this.modalObserv = modalObserv;
    }

    public boolean isDocRequ() {
        return docRequ;
    }

    public void setDocRequ(boolean docRequ) {
        this.docRequ = docRequ;
    }

    public boolean isOperAprob() {
        return operAprob;
    }

    public void setOperAprob(boolean operAprob) {
        this.operAprob = operAprob;
    }

    public List<CuentaingresoTramite> getCuentasIngresoOp() {
        return cuentasIngresoOp;
    }

//    public void setCuentasIngresoOp(List<CuentaingresoTramite> cuentasIngresoOp) {
//        this.cuentasIngresoOp = cuentasIngresoOp;
//    }
    public boolean isCuentIng() {
        return cuentIng;
    }

    public void setCuentIng(boolean cuentIng) {
        this.cuentIng = cuentIng;
    }

    /**
     * @return the movimientoCuentas
     */
    public List<MovimientoCuenta> getMovimientoCuentas() {
        return movimientoCuentas;
    }

    /**
     * @param movimientoCuentas the movimientoCuentas to set
     */
    public void setMovimientoCuentas(List<MovimientoCuenta> movimientoCuentas) {
        this.movimientoCuentas = movimientoCuentas;
    }

    /**
     * @return the errorSolicitante
     */
    public boolean isErrorSolicitante() {
        return errorSolicitante;
    }

    /**
     * @param errorSolicitante the errorSolicitante to set
     */
    public void setErrorSolicitante(boolean errorSolicitante) {
        this.errorSolicitante = errorSolicitante;
    }

    /**
     * @return the errorSol
     */
    public String getErrorSol() {
        return errorSol;
    }

    /**
     * @param errorSol the errorSol to set
     */
    public void setErrorSol(String errorSol) {
        this.errorSol = errorSol;
    }

    /**
     * @return the docRequeridoCargado
     */
    public DocRequerido getDocRequeridoCargado() {
        return docRequeridoCargado;
    }

    /**
     * @param docRequeridoCargado the docRequeridoCargado to set
     */
    public void setDocRequeridoCargado(DocRequerido docRequeridoCargado) {
        this.docRequeridoCargado = docRequeridoCargado;
    }

    /**
     * @return the modalCI
     */
    public boolean isModalCI() {
        return modalCI;
    }

    /**
     * @param modalCI the modalCI to set
     */
    public void setModalCI(boolean modalCI) {
        this.modalCI = modalCI;
    }

    /**
     * @param cuentasIngresoOp the cuentasIngresoOp to set
     */
    public void setCuentasIngresoOp(List<CuentaingresoTramite> cuentasIngresoOp) {
        this.cuentasIngresoOp = cuentasIngresoOp;
    }

    /**
     * @return the cuentasIngresoGuard
     */
    public List<CuentaingresoTramite> getCuentasIngresoGuard() {
        return cuentasIngresoGuard;
    }

    /**
     * @param cuentasIngresoGuard the cuentasIngresoGuard to set
     */
    public void setCuentasIngresoGuard(List<CuentaingresoTramite> cuentasIngresoGuard) {
        this.cuentasIngresoGuard = cuentasIngresoGuard;
    }

    /**
     * @return the movimientoCuenta
     */
    public MovimientoCuenta getMovimientoCuenta() {
        return movimientoCuenta;
    }

    /**
     * @param movimientoCuenta the movimientoCuenta to set
     */
    public void setMovimientoCuenta(MovimientoCuenta movimientoCuenta) {
        this.movimientoCuenta = movimientoCuenta;
    }

    /**
     * @return the certificado
     */
    public Certificado getCertificado() {
        return certificado;
    }

    /**
     * @param certificado the certificado to set
     */
    public void setCertificado(Certificado certificado) {
        this.certificado = certificado;
    }

    /**
     * @return the ubicacion
     */
    public DireccionPersona getUbicacion() {
        return ubicacion;
    }

    /**
     * @param ubicacion the ubicacion to set
     */
    public void setUbicacion(DireccionPersona ubicacion) {
        this.ubicacion = ubicacion;
    }

    /**
     * @return the modalU
     */
    public boolean isModalU() {
        return modalU;
    }

    /**
     * @param modalU the modalU to set
     */
    public void setModalU(boolean modalU) {
        this.modalU = modalU;
    }

    /**
     * @return the dniProp
     */
    public String getDniProp() {
        return dniProp;
    }

    /**
     * @param dniProp the dniProp to set
     */
    public void setDniProp(String dniProp) {
        this.dniProp = dniProp;
    }

    public PersonaJuridica getPersJuridica() {
        return persJuridica;
    }

    public void setPersJuridica(PersonaJuridica persJuridica) {
        this.persJuridica = persJuridica;
    }

    /**
     * @return the tipoDocumento
     */
    public TipoDocumento getTipoDocumento() {
        return tipoDocumento;
    }

    /**
     * @param tipoDocumento the tipoDocumento to set
     */
    public void setTipoDocumento(TipoDocumento tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    /**
     * @return the propietario
     */
    public PersonaNatural getPropietario() {
        return propietario;
    }

    /**
     * @param propietario the propietario to set
     */
    public void setPropietario(PersonaNatural propietario) {
        this.propietario = propietario;
    }

    /**
     * @return the tipoMoneda
     */
    public TipoMoneda getTipoMoneda() {
        return tipoMoneda;
    }

    /**
     * @param tipoMoneda the tipoMoneda to set
     */
    public void setTipoMoneda(TipoMoneda tipoMoneda) {
        this.tipoMoneda = tipoMoneda;
    }

    /**
     * @return the imprimir
     */
    public boolean isImprime() {
        return imprime;
    }

    /**
     * @param imprimir the imprimir to set
     */
    public void setImprime(boolean imprimir) {
        this.imprime = imprimir;
    }

    /**
     * @return the certif
     */
    public boolean isCertif() {
        return certif;
    }

    /**
     * @param certif the certif to set
     */
    public void setCertif(boolean certif) {
        this.certif = certif;
    }

    /**
     * @return the preformateado
     */
    public boolean isPreformateado() {
        return preformateado;
    }

    public void setPreformateado(boolean preformateado) {
        this.preformateado = preformateado;
    }

    public boolean isImprimeDoc() {
        return imprimeDoc;
    }

    public void setImprimeDoc(boolean imprimeDoc) {
        this.imprimeDoc = imprimeDoc;
    }

    public int getTipoDocSol() {
        return tipoDocSol;
    }

    public void setTipoDocSol(int tipoDocSol) {
        this.tipoDocSol = tipoDocSol;
    }

    public String getMontoPagar() {
        return montoPagar;
    }

    public void setMontoPagar(String montoPagar) {
        this.montoPagar = montoPagar;
    }

    public Double getPorcentaje() {
        return porcentaje;
    }

    public void setPorcentaje(Double porcentaje) {
        this.porcentaje = porcentaje;
    }

    public boolean isModalProp() {
        return modalProp;
    }

    public void setModalProp(boolean modalProp) {
        this.modalProp = modalProp;
    }

    public boolean isCreoSol() {
        return creoSol;
    }

    public void setCreoSol(boolean creoSol) {
        this.creoSol = creoSol;
    }

    public String getSexoSol() {
        return sexoSol;
    }

    public void setSexoSol(String sexoSol) {
        this.sexoSol = sexoSol;
    }

    public int getIntPagante() {
        return intPagante;
    }

    public void setIntPagante(int intPagante) {
        this.intPagante = intPagante;
    }

    public boolean isActivarHabilidad() {
        return activarHabilidad;
    }

    public void setActivarHabilidad(boolean activarHabilidad) {
        this.activarHabilidad = activarHabilidad;
    }

    public ColegiadoImagen getColFoto() {
        return colFoto;
    }

    public void setColFoto(ColegiadoImagen colFoto) {
        this.colFoto = colFoto;
    }

    public ColegiadoImagen getColFirma() {
        return colFirma;
    }

    public void setColFirma(ColegiadoImagen colFirma) {
        this.colFirma = colFirma;
    }

    /**
     * @return the listaSellos
     */
    public List<ColegiadoImagen> getListaSellos() {
        return listaSellos;
    }

    /**
     * @param listaSellos the listaSellos to set
     */
    public void setListaSellos(List<ColegiadoImagen> listaSellos) {
        this.listaSellos = listaSellos;
    }

    /**
     * @return the NroCert
     */
    public String getNroCert() {
        return NroCert;
    }

    /**
     * @param NroCert the NroCert to set
     */
    public void setNroCert(String NroCert) {
        this.NroCert = NroCert;
    }

    /**
     * @return the docGenerado
     */
    public DocumentoGenerado getDocGenerado() {
        return docGenerado;
    }

    /**
     * @param docGenerado the docGenerado to set
     */
    public void setDocGenerado(DocumentoGenerado docGenerado) {
        this.docGenerado = docGenerado;
    }

    /**
     * @return the tipoPersona
     */
    public int getTipoPersona() {
        return tipoPersona;
    }

    /**
     * @param tipoPersona the tipoPersona to set
     */
    public void setTipoPersona(int tipoPersona) {
        this.tipoPersona = tipoPersona;
    }

    /**
     * @return the perJur
     */
    public PersonaJuridica getPerJur() {
        return perJur;
    }

    /**
     * @param perJur the perJur to set
     */
    public void setPerJur(PersonaJuridica perJur) {
        this.perJur = perJur;
    }

    /**
     * @return the tipoPersonaSol
     */
    public int getTipoPersonaSol() {
        return tipoPersonaSol;
    }

    /**
     * @param tipoPersonaSol the tipoPersonaSol to set
     */
    public void setTipoPersonaSol(int tipoPersonaSol) {
        this.tipoPersonaSol = tipoPersonaSol;
    }

    /**
     * @return the solicitantePer
     */
    public PersonaNatural getSolicitantePer() {
        return solicitantePer;
    }

    /**
     * @param solicitantePer the solicitantePer to set
     */
    public void setSolicitantePer(PersonaNatural solicitantePer) {
        this.solicitantePer = solicitantePer;
    }

    /**
     * @return the solicitanteEmp
     */
    public PersonaJuridica getSolicitanteEmp() {
        return solicitanteEmp;
    }

    /**
     * @param solicitanteEmp the solicitanteEmp to set
     */
    public void setSolicitanteEmp(PersonaJuridica solicitanteEmp) {
        this.solicitanteEmp = solicitanteEmp;
    }

    /**
     * @return the fechIni
     */
    public Date getFechIni() {
        return fechIni;
    }

    /**
     * @param fechIni the fechIni to set
     */
    public void setFechIni(Date fechIni) {
        this.fechIni = fechIni;
    }

    /**
     * @return the fechFin
     */
    public Date getFechFin() {
        return fechFin;
    }

    /**
     * @param fechFin the fechFin to set
     */
    public void setFechFin(Date fechFin) {
        this.fechFin = fechFin;
    }

    /**
     * @return the estadoCert
     */
    public int getEstadoCert() {
        return estadoCert;
    }

    /**
     * @param estadoCert the estadoCert to set
     */
    public void setEstadoCert(int estadoCert) {
        this.estadoCert = estadoCert;
    }

    /**
     * @return the nroExped
     */
    public Long getNroExped() {
        return nroExped;
    }

    /**
     * @param nroExped the nroExped to set
     */
    public void setNroExped(Long nroExped) {
        this.nroExped = nroExped;
    }

    /**
     * @return the costo
     */
    public String getCosto() {
        return costo;
    }

    /**
     * @param costo the costo to set
     */
    public void setCosto(String costo) {
        this.costo = costo;
    }

    /**
     * @return the NroCert2
     */
    public String getNroCert2() {
        return NroCert2;
    }

    /**
     * @param NroCert2 the NroCert2 to set
     */
    public void setNroCert2(String NroCert2) {
        if (NroCert2.length() == 1) {
            NroCert2 = "00000" + NroCert2;
        }
        if (NroCert2.length() == 2) {
            NroCert2 = "0000" + NroCert2;
        }
        if (NroCert2.length() == 3) {
            NroCert2 = "000" + NroCert2;
        }
        if (NroCert2.length() == 4) {
            NroCert2 = "00" + NroCert2;
        }
        if (NroCert2.length() == 5) {
            NroCert2 = "0" + NroCert2;
        }
        this.NroCert2 = NroCert2;
    }
}
